使用場景:明明引用了一個正確的圖片地址,但顯示出來的倒是一個紅叉或寫有「此圖片僅限於網站用戶交流溝通使用
」之類的「假圖片
」。用嗅探軟件找到了多媒體資源的真實地址用下載軟件仍然不能下載。下載一些資源時老是出錯,若是確認地址沒錯的話,大多數狀況都是趕上防盜鏈系統了。常見的防盜鏈系統,通常使用在圖片、音視頻、軟件等相關的資源上。css
實現原理:把當前請求的主機與服務器的主機進行比對,若是不同則就是惡意連接,反之則是正常連接。html
String address=request.getHeader("referer"); //獲取頁面的請求地址 String pathAdd=""; //定義空字符串 if(address!=null){ //判斷當前的頁面的請求地址爲空時 URL urlOne=new URL(address);//實例化URL方法 pathAdd=urlOne.getHost(); //獲取請求頁面的服務器主機 } String address1=request.getRequestURL().toString(); //獲取當前頁面的地址 String pathAdd1=""; if(address1!=null){ URL urlTwo=new URL(address1); pathAdd1=urlTwo.getHost(); //獲取當前服務器的主機 } if(!pathAdd.equals(pathAdd1)){ //判斷當前頁面的主機與服務器的主機是否相同 }
所謂的防盜鏈就是當你以一個非正常渠道去訪問某一個Web資源的時候,服務器會將你的請求忽略而且將你的當前請求變爲按正常渠道訪問時的請求並返回到相應的頁面,用戶只有經過該頁面中的相關操做去訪問想要請求的最終資源。java
例如,你有一個訪問某資源的網址,可是你事先不知道這個網址是有防盜鏈的,那麼當你輸入該網址時你可能會發現,並無立刻跳轉到你想要的資源頁面而是一些無關的信息頁面,可是就是在這些信息頁面中你發現有一個超連接或是其餘操做能夠跳轉到你所訪問的最終資源頁面。瀏覽器
這就是防盜鏈技術了,好了來看一個具體應用:服務器
Request.java package net.csdn.request;import java.io.IOException; import java.io.PrintWriter;import java.util.Enumeration import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Request extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {getDoorChain(request, response);} private void getDoorChain(HttpServletRequest request, HttpServletResponse response) throws IOException { String referer = request.getHeader("referer"); if(referer==null || !referer.endsWith("http://localhost:8080/Request/index.jsp")){ response.sendRedirect("http://localhost:8080/Request/index.jsp"); return; } response.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset =utf-8"); PrintWriter pw = response.getWriter(); pw.write("喜劇片《東成西就》"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
index.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":" +request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> 這裏是防盜鏈技術的應用檢測! <br> <a href ="/Request/Request" >喜劇片 </a> </body> </html>
例如我最終想要經過http://lcoalhost:8080/Request/Request這個網址獲取到我想要的《東成西就》 的資源但是當我真正的輸入這個網址時,卻轉到了: http://localhost:8080/Request/index.jsp這個頁面jsp
只有當你點擊「喜劇片」這個超連接時纔會真正的獲得你想要的資源頁面網站
首先,咱們對空Referer的定義爲,Referer 頭部的內容爲空,或者,一個HTTP請求中根本不包含Referer頭部。ui
那麼何時HTTP請求會不包含Referer字段呢?根據Referer的定義,它的做用是指示一個請求是從哪裏連接過來,那麼當一個請求並非由連接觸發產生的,那麼天然也就不須要指定這個請求的連接來源。url
好比,直接在瀏覽器的地址欄中輸入一個資源的URL地址,那麼這種請求是不會包含Referer字段的,由於這是一個「憑空產生」的HTTP請求,並非從一個地方連接過去的。spa
但若是不容許包含空的Referer,那麼經過瀏覽器直接訪問也是被禁止的。
歡迎關注 http://yunlong.gihub.io