瀏覽器向服務器發(fā)送請求,可能是直接在瀏覽器地址欄中輸入URL地址進行訪問,也可能是點擊一個網頁上的超鏈接而發(fā)出。對于第一種情況,瀏覽器不會發(fā)送Referer請求頭,而對于第二種情況,瀏覽器會使用Referer請求頭字段來標識請求的超鏈接所在網頁的URL。如下所示:
Referer: http://localhost:8080/Example07/
所謂的防盜鏈其實是Referer請求頭的一個很重要的功能,在
防盜鏈及Content-Type解讀文檔中,對于什么是防盜鏈有了詳細的解釋。今天,我們要學習的是如何通過request對象的相關方法實現(xiàn)防盜鏈功能。
1.防盜鏈案例練習
下面的防盜鏈練習是在Servlet中判斷請求的來源,即referer請求頭的值是否包含”localhost”,如果不包含或referer的值為null,則重定向到百度首頁,否則在控制臺上打印“hello“。具體如下所示:
(1)創(chuàng)建一個web應用,Example08,在該應用下創(chuàng)建一個Servlet類,RefererServlet,主要代碼如例1-1所示:
例1-1 RefererServlet.java
public class RefererServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/**
* 使用Referer請求頭,來防盜鏈
*/
String referer = request.getHeader("Referer");
System.out.println(referer);
if(referer == null || !referer.contains("localhost")) {
response.sendRedirect("http://www.baidu.com");
} else {
System.out.println("hello!");
}
}
}
(2)RefererServlet在web.xml文件中,其訪問路徑的配置為:“/RefererServlet”。
(3)將Example08發(fā)布到Tomcat服務器中,然后啟動Tomcat服務器,在瀏覽器地址欄上輸入:http://localhost:8080/Example08/RefererServlet,效果如圖1-1所示:
圖1-1 瀏覽器顯示結果
訪問RefererServlet后跳轉到百度首頁,并且控制臺上打印“null”,表明在地址欄上直接訪問資源,該請求頭的值為空。
(4)在Example08應用中新建一個test.html,主要代碼如例1-2所示:
例1-2 test.html
<body>
<a href="/Example08/RefererServlet">去RefererServlet</a>
</body>
(5)重新啟動Tomcat服務器,在瀏覽器端訪問test.html,如圖1-2所示:
圖1-2 瀏覽器顯示結果
(6)點擊圖1-2所示的超鏈接“去RefererServlet”,控制臺打印結果如圖1-3所示:
圖1-3 控制臺打印結果
圖1-3中打印的Referer請求頭的值正是訪問RefererServlet的請求來源test.html的訪問路徑,其中包含“localhost”,所以“hello”也會被打印在控制臺中。
有了Referer請求頭,我們就可以根據(jù)它的值來判斷訪問來源是否是從本站發(fā)出,也可以通過它來做一些統(tǒng)計工作。
本文版權歸傳智播客Java培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:傳智播客Java培訓學院
首發(fā):http://metathetuscanyresort.com/javaee