Spring Boot 防盗链功能深度解析,保护你的内容不被盗用!

开发 前端
我们成功实现了防盗链功能。每当请求资源时,都会先检查Referer​字段,只有来自允许域名的请求才会被允许访问资源。如果Referer不符合要求,服务器将返回403 Forbidden错误,拒绝提供资源。

随着互联网的快速发展,保护网站资源的安全性变得尤为重要。防盗链技术作为一种有效手段,能够有效防止其他网站非法盗用你的内容资源,尤其是在媒体资源(如图片、视频、文档)等方面。本篇文章将深入探讨如何在Spring Boot 3.4版本的应用中实现防盗链功能,确保你的内容安全不被滥用。

防盗链的基本概念

防盗链,顾名思义,就是防止未经授权的第三方网站通过链接直接调用你的网站资源。常见的盗链行为是,恶意网站将指向你网站资源(如图片、视频等)的链接嵌入其页面,造成你的服务器带宽和资源被消耗,而盗链网站的用户却能够无缝地访问这些资源。为防止此类情况发生,我们需要采取有效措施限制资源的访问权限。

防盗链实现原理

在HTTP请求中,Referer字段会记录请求来源页面的地址。通过判断这个字段,可以识别请求是否来自合法网站。如果请求的Referer字段指向的域名不在信任范围内,则认为该请求是盗链请求,并拒绝处理该请求。

如何实现防盗链

编写防盗链过滤器

首先,我们需要创建一个过滤器来检查每个请求的Referer头部信息。如果Referer信息不合法或者缺失,直接返回禁止访问的错误。

package com.icoderoad.filter;


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 javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;


@WebFilter(urlPatterns = "/resources/*")
public class AntiLeechFilter implements Filter {


    private List<String> allowedDomains;


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 从配置文件中加载允许的域名列表
        String allowedDomainsStr = filterConfig.getInitParameter("allowedDomains");
        allowedDomains = Arrays.asList(allowedDomainsStr.split(","));
    }


    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;


        String referer = request.getHeader("Referer");


        if (referer == null || !isValidReferer(referer)) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden: Unauthorized access.");
            return;
        }


        filterChain.doFilter(request, response);
    }


    private boolean isValidReferer(String referer) {
        return allowedDomains.stream().anyMatch(referer::startsWith);
    }


    @Override
    public void destroy() {
        // 释放资源
    }
}

配置过滤器

接下来,我们需要在Spring Boot项目中注册这个过滤器,并配置允许访问资源的域名。

package com.icoderoad.config;


import com.icoderoad.filter.AntiLeechFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class FilterConfig {


    @Bean
    public FilterRegistrationBean<AntiLeechFilter> antiLeechFilterRegistrationBean() {
        FilterRegistrationBean<AntiLeechFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new AntiLeechFilter());
        registrationBean.addUrlPatterns("/resources/*");  // 设置过滤器作用于需要保护的资源路径
        registrationBean.addInitParameter("allowedDomains", "http://yourdomain.com,https://yourdomain.com");
        return registrationBean;
    }
}

总结

通过上述配置,我们成功实现了防盗链功能。每当请求资源时,都会先检查Referer字段,只有来自允许域名的请求才会被允许访问资源。如果Referer不符合要求,服务器将返回403 Forbidden错误,拒绝提供资源。

在实际应用中,我们可以根据需求进一步拓展防盗链的功能,比如动态更新域名列表、支持更多的请求头验证等。防盗链不仅能保护网站资源,还能有效减轻服务器负载,确保带宽不被浪费。

责任编辑:武晓燕 来源: 路条编程
相关推荐

2020-06-15 09:41:47

网络安全数据技术

2011-05-31 14:57:17

PHP盗链

2019-08-25 07:15:47

Nginx防盗链Linux

2025-01-09 08:36:05

2017-03-22 14:41:43

2024-01-31 23:27:50

盗链Node.js

2014-07-09 08:02:52

WiFi

2024-07-18 09:19:17

Nginx图片安全性

2013-01-16 09:58:57

无线网无线网盗用

2020-09-01 16:56:58

华为云

2024-05-16 11:56:28

2023-12-14 13:28:00

Spring流程Web

2022-06-06 08:42:04

spring-boo开发接口防盗刷

2025-02-08 10:02:03

2010-02-24 16:33:28

Python功能

2022-03-14 09:05:37

Spring项目处理器

2011-08-22 14:04:52

2010-08-18 09:07:26

数据泄密防护DLP公司数据

2023-02-03 14:40:07

2020-11-10 09:19:23

Spring BootJava开发
点赞
收藏

51CTO技术栈公众号