java web 防盗链

使用场景:明明引用了一个正确的图片地址,但显示出来的却是一个红叉或写有“此图片仅限于***网站用户交流沟通使用”之类的“假图片”。用嗅探软件找到了多媒体资源的真实地址用下载软件仍然不能下载。下载一些资源时总是出错,如果确认地址没错的话,大多数情况都是遇上防盗链系统了。常见的防盗链系统,一般使用在图片、音视频、软件等相关的资源上。

实现原理:把当前请求的主机与服务器的主机进行比对,如果不一样则就是恶意链接,反之则是正常链接。

 

什么是Referer?

这里的 Referer 指的是HTTP头部的一个字段,也称为HTTP来源地址(HTTP Referer),用来表示从哪儿链接到目前的网页,采用的格式是URL。换句话说,借着 HTTP Referer 头部网页可以检查访客从哪里而来,这也常被用来对付伪造的跨网站请求。

什么是空Referer,什么时候会出现空Referer?

首先,我们对空Referer的定义为,Referer 头部的内容为空,或者,一个HTTP请求中根本不包含Referer头部。

那么什么时候HTTP请求会不包含Referer字段呢?根据Referer的定义,它的作用是指示一个请求是从哪里链接过来,那么当一个请求并不是由链接触发产生的,那么自然也就不需要指定这个请求的链接来源。

比如,直接在浏览器的地址栏中输入一个资源的URL地址,那么这种请求是不会包含Referer字段的,因为这是一个“凭空产生”的HTTP请求,并不是从一个地方链接过去的。

在防盗链设置中,允许空Referer和不允许空Referer有什么区别?

在防盗链中,如果允许包含空的Referer,那么通过浏览器地址栏直接访问该资源URL是可以访问到的;

但如果不允许包含空的Referer,那么通过浏览器直接访问也是被禁止的。

 

使用Request对象设置页面的防盗链

      所谓的防盗链就是当你以一个非正常渠道去访问某一个Web资源的时候,服务器会将你的请求忽略并且将你的当前请求变为按正常渠道访问时的请求并返回到相应的页面,用户只有通过该页面中的相关操作去访问想要请求的最终资源。

        例如,你有一个访问某资源的网址,但是你事先不知道这个网址是有防盗链的,那么当你输入该网址时你可能会发现,并没有马上跳转到你想要的资源页面而是一些无关的信息页面,但是就是在这些信息页面中你发现有一个超链接或是其他操作可以跳转到你所访问的最终资源页面。
 

 这就是防盗链技术了,好了来看一个具体应用:

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这个页面

只有当你点击“喜剧片”这个超链接时才会真正的得到你想要的资源页面即:

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
防盗链是指在网站上设置一些限制条件,只有满足这些条件的请求才能访问资源。在Java中实现防盗链的方法如下: 1. 获取请求头信息,判断Referer字段是否合法,如果不合法则直接返回错误信息或者跳转到其他页面。 2. 在web.xml中配置过滤器,对请求进行过滤,只有通过过滤器的请求才能访问资源。过滤器可以使用Java EE提供的Filter接口或者Spring框架提供的HandlerInterceptor接口。 3. 在服务器端生成一个动态的URL地址,每次请求资源时,将动态URL地址作为参数传递,服务器端判断动态URL地址是否合法,如果合法则返回资源,否则返回错误信息。 示例代码: 1. 获取请求头信息的方法: ```java String referer = request.getHeader("Referer"); if (referer == null || !referer.startsWith("http://www.example.com")) { response.getWriter().write("Access denied"); return; } ``` 2. 配置过滤器的方法: 在web.xml中添加如下代码: ```xml <filter> <filter-name>anti-leech-filter</filter-name> <filter-class>com.example.AntiLeechFilter</filter-class> </filter> <filter-mapping> <filter-name>anti-leech-filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 创建AntiLeechFilter类,并实现Filter接口: ```java public class AntiLeechFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 初始化操作 } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; String referer = request.getHeader("Referer"); if (referer == null || !referer.startsWith("http://www.example.com")) { HttpServletResponse response = (HttpServletResponse) servletResponse; response.sendRedirect("/access_denied.html"); return; } filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { // 销毁操作 } } ``` 3. 动态URL地址的实现方法: 在服务器端生成一个动态URL地址,如: ```java String url = "/download?file=" + URLEncoder.encode(filename, "UTF-8") + "&token=" + generateToken(); ``` 其中,generateToken()方法根据一定规则生成一个token值,每次请求时将token值作为参数传递,服务器端根据token值判断是否合法,如: ```java String token = request.getParameter("token"); if (isValidToken(token)) { // 返回资源 } else { response.getWriter().write("Access denied"); return; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值