關於防盜鏈兩種寫法:referer.contains();與referer.startsWith();
阿新 • • 發佈:2019-01-13
關於防盜鏈有兩種寫法:
- 程式碼一:referer.contains();------我覺得該方法不是十分規範,因為只要包含對應的關鍵資訊就行,但它並不是以什麼資訊為開頭。
- 程式碼二: referer.startsWith();------我覺得該方法比較規範,驗證以什麼為開頭的。第二種方式的話,還要考慮https的連結,二級域名等其它不同的url。
額外補充:
- !=null不是多此一舉,這是一種程式設計習慣,在使用某物件的方法前,進行非空判斷,避免出現低階錯誤空指標異常~
程式碼一(部分):
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- response.setContentType("text/html;charset=utf-8");
- PrintWriter out = response.getWriter();
- String referer =request.getHeader("referer");//獲取包含referer指定的頭欄位
- String servername = request.getServerName();//獲取伺服器名稱
- if(referer!=null&&referer.contains(servername)){
- response.getWriter().print("downlaod...");
- }else{
- response.sendRedirect("/ch04_1/download.html");
- }
- }
程式碼二(部分):
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- response.setContentType("text/html;charset=utf-8");
- PrintWriter out =response.getWriter();
- // 獲取referer頭的值
- String referer = request.getHeader("referer");
- // 獲取訪問地址
- String sitePart = "http://"+request.getServerName();
- out.println("getServerName():"+sitePart);
- // 判斷referer頭是否為空,這個頭的首地址是否以sitePart開始
- if(referer!=null && referer.startsWith(sitePart)){
- // 處理正在下載的請求
- out.println("dealing download...");
- }else{
- // 非法下載請求跳轉到download.html頁面
- RequestDispatcher rd =request.getRequestDispatcher("/download.html");
- rd.forward(request, response);
- }
- }