package test.request;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//利用referer請求頭實現防盜鏈
public class RequestDemo8 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 獲取請求是從哪里來的
String referer = request.getHeader("referer");
// 如果是直接輸入的地址,或者不是從本網站訪問的重定向到本網站的首頁
if (referer == null || !referer.startsWith("http://localhost")) {
response.sendRedirect("/day06/index.jsp");
// 然后return,不要輸出后面的內容了
return;
}
String date = "日記";
response.getWriter().write(date);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
request.getHeader("referer")的作用
在開發web程序的時候,有時我們需要得到用戶是從什么頁面連過來的,這就用到了referer。
它是http協議,所以任何能開發web程序的語言都可以實現,比如jsp中是:
request.getHeader("referer");
php是$_SERVER['HTTP_REFERER']。其他的我就不舉例了(其實是不會其他的語言)。
js的話就是這樣做:javascript:document.referrer
那它能干什么用呢?我舉兩個例子:
1,防止盜連,比如我是個下載軟件的網站,在下載頁面我先用referer來判斷上一頁面是不是自己網站,如果不是,說明有人盜連了你的下載地址。
2,電子商務網站的安全,我在提交信用卡等重要信息的頁面用referer來判斷上一頁是不是自己的網站,如果不是,可能是黑客用自己寫的一個表單,來提交,為了能跳過你上一頁里的javascript的驗證等目的。
使用referer的注意事項:
如果我是直接在瀏覽器里輸入有referer的頁面,返回是null(jsp),也就是說referer只有從別的頁面點擊連接來到這頁的才會有內容。
我做了個實驗,比如我的referer代碼在a.jsp中,它的上一頁面是b.htm,c.htm是一個帶有iframe的頁面,它把a.jsp嵌在iframe里了。我在瀏覽器里輸入b.htm的地址,然后點擊連接去c.htm,那顯示的結果是b.htm,如果我在瀏覽器里直接輸入的是c.htm那顯示的是c.htm
http請求頭中Referer的含義和作用
Referer 是 HTTP 請求header 的一部分,當瀏覽器(或者模擬瀏覽器行為)向web 服務器發送請求的時候,頭信息里有包含 Referer 。比如我在www.google.com 里有一個www.baidu.com 鏈接,那么點擊這個www.baidu.com ,它的header 信息里就有:
Referer=http://www.google.com
由此可以看出來吧。它就是表示一個來源。看下圖的一個請求的 Referer 信息。

這里有一個小問題要說明下。
Referer 的正確英語拼法是referrer 。由於早期HTTP規范的拼寫錯誤,為了保持向后兼容就將錯就錯了。其它網絡技術的規范企圖修正此問題,使用正確拼法,所以目前拼法不統一。還有它第一個字母是大寫。
Referer的作用?
1.防盜鏈。
剛剛前面有提到一個小 Demo 。
我在www.google.com里有一個www.baidu.com鏈接,那么點擊這個www.baidu.com,它的header信息里就有:
Referer=http://www.google.com
那么可以利用這個來防止盜鏈了,比如我只允許我自己的網站訪問我自己的圖片服務器,那我的域名是www.google.com,那么圖片服務器每次取到Referer來判斷一下是不是我自己的域名www.google.com,如果是就繼續訪問,不是就攔截。
這是不是就達到防盜鏈的效果了?
將這個http請求發給服務器后,如果服務器要求必須是某個地址或者某幾個地址才能訪問,而你發送的referer不符合他的要求,就會攔截或者跳轉到他要求的地址,然后再通過這個地址進行訪問。
2.防止惡意請求。
比如靜態請求是*.html結尾的,動態請求是*.shtml,那么由此可以這么用,所有的*.shtml請求,必須 Referer 為我自己的網站。
Referer=http://www.google.com
空Referer是怎么回事?什么情況下會出現Referer?
首先,我們對空 Referer 的定義為, Referer 頭部的內容為空,或者,一個 HTTP 請求中根本不包含 Referer 頭部。
那么什么時候 HTTP 請求會不包含 Referer 字段呢?根據Referer的定義,它的作用是指示一個請求是從哪里鏈接過來,那么當一個請求並不是由鏈接觸發產生的,那么自然也就不需要指定這個請求的鏈接來源。
比如,直接在瀏覽器的地址欄中輸入一個資源的URL地址,那么這種請求是不會包含 Referer 字段的,因為這是一個“憑空產生”的 HTTP 請求,並不是從一個地方鏈接過去的。
那么在防盜鏈設置中,允許空Referer和不允許空Referer有什么區別?
允許 Referer 為空,意味着你允許比如瀏覽器直接訪問,就是空。
