关于防盗链有两种写法:
- 代码一:referer.contains();------我觉得该方法不是十分规范,因为只要包含对应的关键信息就行,但它并不是以什么信息为开头。
- 代码二: referer.startsWith();------我觉得该方法比较规范,验证以什么为开头的。第二种方式的话,还要考虑https的链接,二级域名等其它不同的url。
额外补充:
- !=null不是多此一举,这是一种编程习惯,在使用某对象的方法前,进行非空判断,避免出现低级错误空指针异常~
- 现在新版本的java中有optional类,对!=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);
- }
- }