1 什么是 防盗链
比如 A 网站有一张图片,被 B 网站直接通过 img
标签属性引入,直接盗用A网站图片展示。
防盗链技术
:限制资源只能在某服务器访问。
在互联网中通讯的底层是
Socket
技术,Socket
技术里面本质是二进制文件流
传输
白名单与黑名单
在网关里面进行白名单和黑名单权限判断
2 如何实现防盗链
判断 HTTP
请求头 Referer
域中的记录来源的值,如果和当前访问的域名不一致的情况下,说明该图片可能被其他服务器盗用。
如果在浏览器分
F12
里面查看不到请求头,清除缓存即可
2.1 使用过滤器判断请求头 Referer
记录请求来源
配置文件:
img:
url: www.local.com
过滤器:
package com.snow.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
/**
*
* 图片防盗链
*
*/
@WebFilter(filterName = "imgFilter", urlPatterns = "/imgs/*")
public class ImgFilter implements Filter {
@Value("${img.url}")
private String imgUrl;
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
/**
*
*
* @param request
* @param response
* @param chain
* @throws IOException
* @throws ServletException
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 1.获取请求头中的来源字段
HttpServletRequest req = (HttpServletRequest) request;
String referer = req.getHeader("Referer");
if (StringUtils.isEmpty(referer)) {
request.getRequestDispatcher("/imgs/error.png").forward(req, response);
return;
}
// 2.判断请求头中的域名是否和限制的域名一致
String domainUrl = getDomain(referer);
// 正常情况 黑名单 白名单接口
System.out.println("imgUrl ------" + imgUrl);
if (!domainUrl.equals(imgUrl)) {
request.getRequestDispatcher("/imgs/error.png").forward(req, response);
return;
}
// 直接放行图片
chain.doFilter(req, response);
}
// 获取url对应的域名
private String getDomain(String url) {
String result = "";
int j = 0, startIndex = 0, endIndex = 0;
for (int i = 0; i < url.length(); i++) {
if (url.charAt(i) == '/') {
j++;
if (j == 2)
startIndex = i;
else if (j == 3)
endIndex = i;
}
}
result = url.substring(startIndex + 1, endIndex);
return result;
}
public void destroy() {
// TODO Auto-generated method stub
}
}
注意:测试的时候,最好开启两个不同的浏览器测试,避免图片缓存的原因。