其实,图片防盗链的实现如此简单

唠嗑部分

首先我们来看一个现象,这是小白在开发小白博客时遇到的一个真实现象

情况说明:是这样一个功能哈,发布博客时有富文本编辑器,那么其中就会包含图片,小白将提前写好的md文档复制进去的时候,图片全部加载失败(在本地编写md文档时图片使用码云做的图床,图片均在码云上面),看如下现象

image-20230511143118361

那么这是怎么回事呢?将图片链接复制在浏览器打开图片是正常的,为什么富文本中加载不到呢?

图片存在于码云服务器,我们要在www.cxs.plus服务上访问它,假如能访问,会有什么影响?

大家都知道,访问资源会消耗我们的流量,也会消耗被访问者的资源和流量,加重服务器负担,所以在系统中,防盗链系统是必不可少的

盗链是指在自己的页面上展示一些并不在自己服务器上的内容。通常的做法是通过技术手段获得它人服务器上的资源地址,绕过别人的资源展示页面,直接在自己的页面上向最终用户提供此内容。比较常见的是一些小站盗用大站的资源(图片、音乐、视频、软件等),对于这些小站来说,通过盗链的方法可以减轻自己服务器的负担,因为真实的空间和流量均是来自别人的服务器。

防盗链系统就是防范盗链的系统,防止别人通过一些技术手段绕过本站的资源展示页面,盗用本站的资源,让绕开本站资源展示页面的资源链接失效。实施防盗链系统后,因为屏蔽了那些盗链的间接资源请求,从而可以大大减轻服务器及带宽的压力,也正如此,越来越多的站点都开始实施防盗链技术。

言归正传

我们打开NetWork选项,发现我们所有的图片请求均被重定向了,我们注意到每个请求都加了这个请求头:Referer,这个请求头表示你是从哪个地址发出的请求,即我们在www.cxs.plus请求码云的图片,浏览器会自动添加

image-20230511144420345

那根据以上的知识,那我们能否自己做一个防盗链,让我们的图片资源也只能站内引用?答案是可以的

小白博客的图片资源均通过服务器访问,后续会动静分离,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);
        }
    }

本地测试

首先正常访问,看,图片均正常访问

image-20230511145704362

我们修改一下代码,模拟被盗用吧,将此处修改为baidu.com,那我们从127.0.0.1访问就盗链了

image-20230511145813114

看下效果,所有图片均为系统偏爱图标,当然可以提前准备一张好看的图片

image-20230511150129641

结语

1、以上我们就实现了服务器的防盗链功能。

2、实际上,图片会有单独的服务器,访问不会走应用服务,使用nginx动静分离也可以实现防盗链,可以自行了解一下配置。

3、制作不易,一键三连再走吧,您的支持永远是我最大的动力!

4、Java全栈技术交流,Q群:941095490,欢迎你的到来!(未来高手如云)

猜你喜欢

转载自blog.csdn.net/admin_2022/article/details/130637105