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); } }
在開發web程序的時候,有時咱們須要獲得用戶是從什麼頁面連過來的,這就用到了referer。
它是http協議,因此任何能開發web程序的語言均可以實現,好比jsp中是:
request.getHeader("referer");
php是$_SERVER['HTTP_REFERER']。其餘的我就不舉例了(實際上是不會其餘的語言)。javascript
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.htmphp
Referer 是 HTTP 請求header
的一部分,當瀏覽器(或者模擬瀏覽器行爲)向web
服務器發送請求的時候,頭信息裏有包含 Referer 。好比我在www.google.com 裏有一個www.baidu.com
連接,那麼點擊這個www.baidu.com
,它的header
信息裏就有:html
Referer=http://www.google.comjava
由此能夠看出來吧。它就是表示一個來源。看下圖的一個請求的 Referer 信息。web
Referer 的正確英語拼法是referrer
。因爲早期HTTP規範的拼寫錯誤,爲了保持向後兼容就將錯就錯了。其它網絡技術的規範企圖修正此問題,使用正確拼法,因此目前拼法不統一。還有它第一個字母是大寫。json
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 頭部的內容爲空,或者,一個 HTTP 請求中根本不包含 Referer 頭部。
那麼何時 HTTP 請求會不包含 Referer 字段呢?根據Referer的定義,它的做用是指示一個請求是從哪裏連接過來,那麼當一個請求並非由連接觸發產生的,那麼天然也就不須要指定這個請求的連接來源。
好比,直接在瀏覽器的地址欄中輸入一個資源的URL地址,那麼這種請求是不會包含 Referer 字段的,由於這是一個「憑空產生」的 HTTP 請求,並非從一個地方連接過去的。
容許 Referer 爲空,意味着你容許好比瀏覽器直接訪問,就是空。