利用Referer請求頭防止“盜鏈”-Javaweb

~本特利~發表於2020-11-01
~本特利~

在實際開發中,經常會使用Referer頭欄位,例如,一些站點為了吸引人氣並且提高站點訪問量,提供了各種軟體的下載頁面,但是它們本身沒有這些資源,只是將下載的超連結指向其它站點上的資源。而真正提供了下載資源的站點為了防止這種“盜鏈”,就需要檢查請求來源,只接收本站連結傳送的下載請求,阻止其它站點連結的下載請求。

1.在專案的包裡編寫一個名為的類,負責提供下載內容並且要求下載請求的連結必須通過本網站進入,否則會將請求轉發給下載說明的HTML頁面

public class DownManagerServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
	         // 獲取referer頭的值
			String referer = request.getHeader("referer"); 
	         // 獲取訪問地址
			String sitePart = "http://" + request.getServerName();
			// 判斷referer頭是否為空,這個頭的首地址是否以sitePart開始的
			if (referer != null && referer.startsWith(sitePart)) {
				// 處理正在下載的請求
				out.println("dealing download ...");
			} else {
				// 非法下載請求跳轉到download.html頁面
				RequestDispatcher rd = request.getRequestDispatcher("/download.html");
				rd.forward(request, response);
			}
		}
		public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
			doGet(request, response);
		}
	}

2.在web根目錄下編寫一個下載說明的檔案download.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="/chapter04/DownManagerServlet">download</a>
</body>
</html>

3.在web.xml中配置好相關對映

    <servlet>
        <display-name>DownManagerServlet</display-name>
        <servlet-name>DownManagerServlet</servlet-name>
        <servlet-class>cn.edu.demo04.request.DownManagerServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DownManagerServlet</servlet-name>
        <url-pattern>/DownManagerServlet</url-pattern>
    </servlet-mapping>

在這裡插入圖片描述
在這裡插入圖片描述

相關文章