防盜鏈[referer]
防盜鏈要實現的是這樣一種效果:比如說其他的網站引用本網站的圖片資源,將會顯示一個錯誤圖片,只有是本網站內的網頁引用時候,圖片纔可以正常顯示。這種應該是比較常見的,例如經常逛論壇的人會看到別人貼的圖顯示出來是一個錯誤圖片,如百度圖片不可以外鏈等,用到的就是這個Filter。
首先說下Filter的工作區域是在客戶端請求request抵達Servlet之前和服務器響應response在從Servlet抵達客戶端瀏覽器之前。即FilterChain起到了一個過濾網的作用。所以在顯示圖片之前,先來驗證圖片的來源,再決定要不要正常顯示該圖片。
那麼如何判定圖片的來源呢?這裏涉及到了一個知識點:referer
什麼是referer呢?HTTP協議可能學網絡的人更熟悉一點,HTTP headers是HTTP請求和相應的核心模塊,它承載了關於客戶端瀏覽器、請求頁面、服務器等相關信息。Referer是HTTP頭中的一個屬性,告訴服務器我是從哪個頁面鏈接過來的,比如說如果我博客上面有友情鏈接到朋友的博客,那麼就可以從referer中統計出來一段時間內有多少點擊量是從我的博客鏈接到朋友的博客。
Java中獲取referer的方法是:request.getHeader(“referer”)
判斷盜鏈:
String referer = request.getHeader("referer");
//getServerName() 返回網站的域名
if(referer==null || !referer.contains(request.getServerName())){
//轉到一個錯誤的圖片
request.getRequestDispatcher("/error.gif").forward(request.response); }
else
{
chain.doFilter(request,response);
}
request.getHeader(“referer”)可用的情況:
1. 表單提交
不可用的情況:
1.從收藏夾鏈接
2.自定義地址
3.瀏覽器直接輸入
…
下面是一個對referer和getServerName()的小測試:
新建兩個jsp頁面,分別命名爲srcFilter.jsp 和 testFilter.jsp
srcFilter做一個鏈接到testFilter.jsp,顯示testFilter頁面的referer和serverName
srcFilter:
1 點擊
testFilter:
1 <%
2 String referer = request.getHeader("referer");
3 String serverName = request.getServerName();
4 %>
5 <div>serverName : <%=serverName %></div>
6 <div>referer : <%=referer %></div>
點擊鏈接後跳轉到testFilter頁面顯示結果爲:
serverName : localhost
referer : http://localhost:8080/filter/srcFilter.jsp