SpringBoot防盗链

1. 前言

在当今的互联网环境中,资源的保护愈发重要。防盗链作为一种保护网站资源不被其他网站随意盗用的手段,显得尤为关键。本文将详细介绍如何在Spring Boot项目中实现防盗链功能

什么是防盗链

防盗链是指防止未经授权的网站通过链接直接访问本网站的资源,比如图片、视频、文件等。常见的盗链行为是其他网站通过在其页面中嵌入指向我们网站资源的链接,让用户在其网站上看似正常访问这些资源,实则消耗的是我们网站的带宽和服务器资源

实现防盗链的原理

在HTTP请求中,有一个重要的头部字段Referer,它记录了请求来源的页面地址。我们可以通过检查这个字段来判断请求是否来自合法的来源。如果请求的Referer不是我们信任的域名,那么就可以认为这是一个盗链请求,从而拒绝该请求

2. 具体实现

  1. 防盗链过滤器
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    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) {
    // 没有Referer,可能是直接在浏览器地址栏输入,也视为非法请求
    response.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden");
    return;
    }

    boolean isValidReferer = false;
    for (String domain : allowedDomains) {
    if (referer.startsWith(domain)) {
    isValidReferer = true;
    break;
    }
    }

    if (!isValidReferer) {
    response.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden");
    return;
    }

    filterChain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    // 清理资源
    }
    }
  1. 配置过滤器
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @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;
    }
    }

3. 结束语

通过检查请求的Referer字段,有效防止了资源被非法盗用。在实际应用中,可以根据具体需求进一步优化和扩展防盗链的逻辑,比如支持更多的请求头检查方式、动态更新允许的域名列表等