唠嗑部分
首先我们来看一个现象,这是小白在开发小白博客时遇到的一个真实现象
情况说明:是这样一个功能哈,发布博客时有富文本编辑器,那么其中就会包含图片,小白将提前写好的md文档复制进去的时候,图片全部加载失败(在本地编写md文档时图片使用码云做的图床,图片均在码云上面),看如下现象
那么这是怎么回事呢?将图片链接复制在浏览器打开图片是正常的,为什么富文本中加载不到呢?
图片存在于码云服务器,我们要在www.cxs.plus服务上访问它,假如能访问,会有什么影响?
大家都知道,访问资源会消耗我们的流量,也会消耗被访问者的资源和流量,加重服务器负担,所以在系统中,防盗链系统是必不可少的
盗链是指在自己的页面上展示一些并不在自己服务器上的内容。通常的做法是通过技术手段获得它人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。比较常见的是一些小站盗用大站的资源(图片、音乐、视频、软件等),对于这些小站来说,通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器。
防盗链系统就是防范盗链的系统,防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源,让绕开本站资源展示页面的资源链接失效。实施防盗链系统后,因为屏蔽了那些盗链的间接资源请求,从而可以大大减轻服务器及带宽的压力,也正如此,越来越多的站点都开始实施防盗链技术。
言归正传
我们打开NetWork选项,发现我们所有的图片请求均被重定向了,我们注意到每个请求都加了这个请求头:Referer,这个请求头表示你是从哪个地址发出的请求,即我们在www.cxs.plus请求码云的图片,浏览器会自动添加
那根据以上的知识,那我们能否自己做一个防盗链,让我们的图片资源也只能站内引用?答案是可以的
小白博客的图片资源均通过服务器访问,后续会动静分离,nginx也提供了防盗链的配置,也是可以实现的
那么在java端,我们如何实现防盗链呢?
思路分析:
1、首先我们进行环境的判断,本地开发都是从127.0.0.1来的,部署后来自于域名xxx.cxs.plus
2、我们新建过滤器,拦截图片访问请求,获取请求头Referer,如果为空,放行,dev如果包含127.0.0.1或者cxs.plus(本地也配置了域名),放行,服务器环境包含cxs.plus,放行,其余均重定向到系统的偏爱图标
代码实现
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
// 获取请求的url
String requestURI = request.getRequestURI();
// 判断是否是图片访问请求
if (requestURI.startsWith(CommonContent.FILE_ACCESS_PREFIX)) {
// 获取环境
Boolean dev = commonConfig.getDev();
// 获取Referer请求头
String referer = request.getHeader("Referer");
if (StringUtils.hasLength(referer)) {
if (dev) {
// 本地dev实现
if (referer.contains("127.0.0.1") || referer.contains(commonConfig.getDomian())) {
filterChain.doFilter(request, response);
} else {
// 重定向到系统的偏爱图标
response.sendRedirect(commonConfig.getDefaultImageUrl());
}
} else {
// prod实现
if (referer.contains(commonConfig.getDomian())) {
filterChain.doFilter(request, response);
} else {
response.sendRedirect(commonConfig.getDefaultImageUrl());
}
}
} else {
filterChain.doFilter(request, response);
}
} else {
filterChain.doFilter(request, response);
}
}
本地测试
首先正常访问,看,图片均正常访问
我们修改一下代码,模拟被盗用吧,将此处修改为baidu.com,那我们从127.0.0.1访问就盗链了
看下效果,所有图片均为系统偏爱图标,当然可以提前准备一张好看的图片
结语
1、以上我们就实现了服务器的防盗链功能。
2、实际上,图片会有单独的服务器,访问不会走应用服务,使用nginx动静分离也可以实现防盗链,可以自行了解一下配置。
3、制作不易,一键三连再走吧,您的支持永远是我最大的动力!
4、Java全栈技术交流,Q群:941095490,欢迎你的到来!(未来高手如云)