轉自:http://wisdomsong2007.blog.163.com/blog/static/47783725200882523820664/
前言
有一些站點自己沒有提供下載空間,但是為了吸引人氣和提高站點的訪問量,他們也提供了各種軟件的下載頁面,並讓下載的超鏈接指向其他站點上的資源。另外一些真正提供了下載空間的站點為了防止這種“盜鏈”,需要檢查請求的來路,只接受本站內的頁面鏈接進來的下載請求,而阻止其他站點的頁面鏈接進來的下載請求。要實現這樣的功能,就需要檢查請求消息的referer頭字段是否與本站匹配。
內容
動手體驗:利用Referer請求頭阻止“盜鏈”
(1)編寫一個名為DownManagerServlet的Servlet程序,這個Servlet程序負責提供下載內容,但它要求下載請求必須通過本站的下載頁面鏈接進來,否則將請求轉發給本站的下載說明頁。
1. DownManagerServlet.java
package com.horizon.servlet; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class DownManagerServlet extends HttpServlet { private static final long serialVersionUID = -6169822662725860603L; public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html ;charset=gb2312"); PrintWriter out = response.getWriter(); String referrer = request.getHeader("referer"); String sitePart = "http://" + request.getServerName(); if (referrer != null && referrer.startsWith(sitePart)) { // 處理正當的下載請求,這里只進行示意 out.println("dealing download ..."); } else { // 非法下載請求跳轉到本站的下載說明頁 RequestDispatcher rd = request.getRequestDispatcher("/down.html"); rd.forward(request, response); } } }
2. web.xml文件內容:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>HelloServlet</display-name> <servlet> <servlet-name>DownManagerServlet</servlet-name> <servlet-class>com.horizon.servlet.DownManagerServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DownManagerServlet</servlet-name> <url-pattern>/servlet/DownManagerServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
3. down.html內容:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> this is the down.html </body> </html>
4. index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> <base href="http://localhost:6060/HelloServlet/down.html" /> </head> <body> <a href="servlet/DownManagerServlet">down</a> </body> </html>
5. 如圖結構:
6.
接着在瀏覽器地址欄中輸入如下地址:
http://localhost:6060/HelloServlet/servlet/DownManagerServlet
由於這是直接在瀏覽器地址欄中輸入的訪問地址,請求消息中不含Referer請求頭,DownManagerServlet將down.html頁面轉發給瀏覽器,瀏覽器中顯示的結果如圖所示:
單擊圖中的超鏈接再次訪問DownManagerServlet,由於這時的請求消息中包含有Referer請求頭且其值與DownManagerServlet位於同一WEB站點,DownManagerServlet接受下載請求,瀏覽器中顯示的結果如圖所示: