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中网站防盗链手段