HTTP请求防盗链:只允许某些域名请求来源才可以访问。
比如A网站有一张图片或音频等资源被B网站直接通过img等标签属性引入使用,这样就是B网站盗用了A网站的资源。那么对于A网站来说,流量怎么被消耗的都不知道。
解决思路:
判断http请求头Referer域中的请求来源的值,如果和当前访问的域名(或者被允许的一些域名)不一致的情况下,说明该图片可能被其他服务器盗用。
注意:上句话中括弧中:被允许的一些域名,这个是基于黑白名单而言的,拦截请求,判断请求头的Referer是否包含黑名单的域名,包含则拦截请求,不包含就放行。
看一个http请求头信息:
代码实现:
web.xml 配置Filter:
<filter>
<filter-name>ImgFilter</filter-name>
<filter-class>com.******.filter.ImgFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ImgFilter</filter-name>
<url-pattern>/static/*</url-pattern>
</filter-mapping>
java代码:
public class ImgFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化...");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
System.out.println("doFilter....");
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
//获取请求头中来源
String referer = req.getHeader("referer");
//获取当前请求名称
String domainUrl = request.getServerName();
//String domainUrl = getDomain(referer);//获取黑白名单域名,然后一一与referer比对即可
System.out.println("referer:"+referer+"----domainUrl :"+domainUrl );
//referer为null,代表直接地址栏范围 或者不包含应用名的 都是非法访问连接
if(referer==null||(!referer.contains(domainUrl ))){
req.getRequestDispatcher("/imgs/error.png").forward(req, res);
return ;
}
chain.doFilter(req, res);
}
public void destroy() {
}
}
除此之外:nginx也可以做防盗链:nginx防盗链
推荐:8中网站防盗链手段