原文出處:http://www.cnblogs.com/devilfree/archive/2012/09/11/2680914.html
html
總結一下今天學習防盜鏈Filter的一些知識點:java
防盜鏈要實現的是這樣一種效果:好比說其餘的網站引用本網站的圖片資源,將會顯示一個錯誤圖片,只有是本網站內的網頁引用時候,圖片才能夠正常顯示。這種應該是比較常見的,例如常常逛論壇的人會看到別人貼的圖顯示出來是一個錯誤圖片,如百度圖片不能夠外鏈等,用到的就是這個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.<a href="">
2.表單提交
不可用的狀況:
1.從收藏夾連接
2.自定義地址
3.瀏覽器直接輸入
...jsp
下面是一個對referer和getServerName()的小測試:學習
新建兩個jsp頁面,分別命名爲srcFilter.jsp 和 testFilter.jsp測試
srcFilter作一個連接到testFilter.jsp,顯示testFilter頁面的referer和serverName網站
srcFilter:spa
1 <a href="testFilter.jsp">點擊</a>
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頁面顯示結果爲: