一文吃透:若依框架静态资源防盗链从原理到代码

简介: 若依(RuoYi)框架的防盗链功能实现方式,我会从核心原理、代码实现、配置方式、关键细节四个维度拆解,兼顾原理理解和实操落地,适配若依单体版(RuoYi-Vue)和微服务版(RuoYi-Cloud)的通用逻辑

 你想了解若依(RuoYi)框架的防盗链功能实现方式,我会从核心原理、代码实现、配置方式、关键细节四个维度拆解,兼顾原理理解和实操落地,适配若依单体版(RuoYi-Vue)和微服务版(RuoYi-Cloud)的通用逻辑。

若依最新前后端分离源码下载:

https://gitee.com/ruoyieleadmin/ruoyi-ele-admin

一、防盗链核心原理

若依框架的防盗链本质是基于 HTTP 协议的 Referer 头校验 + 白名单机制

  1. Referer 头:HTTP 请求头中的 Referer 字段会记录当前请求是从哪个页面跳转过来的(比如从 A 网站访问 B 网站的图片,B 网站能通过 Referer 看到请求来源是 A 网站);
  2. 核心逻辑:服务器接收到静态资源(图片、文件、视频等)请求时,校验 Referer 头是否在预设的白名单内(比如只允许自家域名访问),若不在则拒绝请求(返回 403 或重定向);
  3. 补充场景:对无 Referer 的请求(如直接在浏览器输入资源 URL),可配置为 “允许” 或 “拒绝”,适配不同安全需求。

二、若依框架防盗链的具体实现(代码层面)

若依框架的防盗链功能集成在 Spring MVC 的拦截器 / 过滤器 中,核心代码在框架的 WebMvcConfig 或自定义的 Filter 类中,以下是关键实现步骤和代码:

1. 核心拦截器 / 过滤器实现(通用版)

若依通常通过 OncePerRequestFilter(过滤器,确保一次请求只执行一次)实现防盗链校验,核心代码如下(可直接复用):

java

运行

package com.ruoyi.framework.filter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
/**
 * 若依框架 防盗链过滤器
 * 核心:校验Referer头,只允许白名单域名访问静态资源
 */
@Component
public class RefererFilter extends OncePerRequestFilter {
    /**
     * 防盗链白名单(配置在application.yml中,多个域名用逗号分隔)
     * 示例:ruoyi.com,localhost:8080,127.0.0.1:8080
     */
    @Value("${ruoyi.antiHotlink.allowReferer:}")
    private String allowReferer;
    /**
     * 需要拦截的资源后缀(静态资源)
     */
    private static final List<String> INTERCEPT_SUFFIX = Arrays.asList(".jpg", ".png", ".gif", ".mp4", ".pdf", ".docx");
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        // 1. 获取请求URL,判断是否为需要拦截的静态资源
        String requestURI = request.getRequestURI().toLowerCase();
        boolean isIntercept = INTERCEPT_SUFFIX.stream().anyMatch(requestURI::endsWith);
        if (!isIntercept) {
            // 非静态资源,直接放行
            filterChain.doFilter(request, response);
            return;
        }
        // 2. 解析白名单
        List<String> allowList = Arrays.asList(allowReferer.split(","));
        if (allowList.isEmpty()) {
            // 白名单为空,直接放行(或根据需求返回403)
            filterChain.doFilter(request, response);
            return;
        }
        // 3. 获取Referer头
        String referer = request.getHeader("Referer");
        if (referer == null || referer.isEmpty()) {
            // 无Referer请求(直接访问资源URL),可配置为放行/拒绝
            // 此处示例:拒绝无Referer的请求
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            response.getWriter().write("403 Forbidden: 非法访问(无Referer)");
            return;
        }
        // 4. 校验Referer是否在白名单内
        boolean isAllow = allowList.stream().anyMatch(referer::contains);
        if (isAllow) {
            // 合法来源,放行
            filterChain.doFilter(request, response);
        } else {
            // 非法来源,返回403
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            response.getWriter().write("403 Forbidden: 非法访问(防盗链拦截)");
        }
    }
}

image.gif

2. 若依框架默认配置(application.yml)

application.yml 中添加防盗链白名单配置,与上述过滤器关联:

yaml

ruoyi:
  # 防盗链配置
  antiHotlink:
    # 允许的Referer白名单(多个域名用逗号分隔)
    allowReferer: "ruoyi.com,localhost:8080,127.0.0.1:8080,192.168.1.0/24"

image.gif

3. 注册过滤器(关键步骤)

若依框架需将上述过滤器注册到 Spring 容器,通常在 WebConfig 类中配置(若依单体版的 WebMvcConfig 已集成类似逻辑):

java

运行

package com.ruoyi.framework.config;
import com.ruoyi.framework.filter.RefererFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * 过滤器注册配置
 */
@Configuration
public class FilterConfig {
    @Autowired
    private RefererFilter refererFilter;
    /**
     * 注册防盗链过滤器
     */
    @Bean
    public FilterRegistrationBean<RefererFilter> refererFilterRegistration() {
        FilterRegistrationBean<RefererFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(refererFilter);
        // 拦截所有请求(后续在过滤器内筛选静态资源)
        registration.addUrlPatterns("/*");
        // 过滤器名称
        registration.setName("refererFilter");
        // 执行顺序(数字越小,执行越早)
        registration.setOrder(1);
        return registration;
    }
}

image.gif

三、若依微服务版(RuoYi-Cloud)的特殊处理

微服务版的防盗链逻辑与单体版一致,但需注意:

  1. 拦截位置:建议在网关(Gateway)层实现防盗链,而非每个业务模块,避免重复校验;
  2. 网关层实现:通过 Gateway 的 GlobalFilter 替代 OncePerRequestFilter,核心逻辑不变,只是适配网关的 API:

java

运行

@Component
public class GatewayRefererFilter implements GlobalFilter, Ordered {
    @Value("${ruoyi.antiHotlink.allowReferer:}")
    private String allowReferer;
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        String requestURI = request.getPath().value().toLowerCase();
        // 1. 校验资源类型(同单体版)
        // 2. 获取Referer(网关层获取请求头的方式)
        String referer = request.getHeaders().getFirst("Referer");
        // 3. 白名单校验(逻辑同单体版)
        // 4. 放行/拒绝(网关层拒绝请求的方式)
        if (!isAllow) {
            ServerHttpResponse response = exchange.getResponse();
            response.setStatusCode(HttpStatus.FORBIDDEN);
            return response.setComplete();
        }
        return chain.filter(exchange);
    }
    @Override
    public int getOrder() {
        return 1; // 执行顺序
    }
}

image.gif

四、关键细节与优化

  1. 白名单配置技巧
  • 支持通配符:如 *.ruoyi.com 匹配所有子域名(需在代码中处理通配符逻辑);
  • 支持 IP 段:如 192.168.1.0/24 匹配整个网段;
  • 本地开发时,务必将 localhost:8080127.0.0.1:8080 加入白名单,避免本地调试被拦截。
  1. 例外场景处理
  • 对 API 接口(如 /api/**)无需拦截,只拦截静态资源(.jpg/.png/.mp4 等);
  • 对后台管理系统的资源(如 /static/**),可单独放行,避免误拦截。
  1. 绕过 Referer 的应对
  • 部分恶意请求会伪造 Referer 头,可结合 IP 白名单Token 校验 增强防护;
  • 对高价值资源(如付费视频),可添加 签名校验(如 URL 带时效签名),仅靠 Referer 不够。
  1. 若依框架默认是否开启
  • 若依基础版未默认开启防盗链,需手动添加上述过滤器和配置;
  • 若依增强版 / 企业版可能已集成防盗链功能,可在 application.yml 中直接配置白名单启用。

总结

若依框架的防盗链核心是:

  1. 核心机制:基于 HTTP Referer 头的白名单校验,通过过滤器拦截静态资源请求;
  2. 实现方式:单体版用 OncePerRequestFilter,微服务版在网关层用 GlobalFilter
  3. 关键配置:在 application.yml 中配置允许的 Referer 白名单,按需拦截指定后缀的静态资源;
  4. 优化建议:生产环境需结合 IP 白名单、签名校验,避免仅依赖 Referer 导致防护失效。
若依最新前后端分离源码下载:

https://gitee.com/ruoyieleadmin/ruoyi-ele-admin

相关文章
|
2月前
|
安全 Java API
将若依(RuoYi)框架从适配 Spring Boot 2 的版本升级到 Spring Boot 3
将若依(RuoYi)框架从适配 Spring Boot 2 的版本升级到 Spring Boot 3,这是一个涉及依赖、配置、API 兼容等多方面的系统性升级工作。
405 5
|
2月前
|
安全 JavaScript Java
若依后台权限核心:Spring Security 认证授权详解
若依(RuoYi)框架整合 Spring Security 的具体实现方式,我会从核心原理、整合步骤、关键配置、实战示例四个维度,结合若依前后端分离版(Spring Boot + Vue)的特点,给出可直接落地的整合方案,帮你理解若依是如何基于 Spring Security 实现权限管控
177 4
|
1月前
|
Web App开发 Java 数据安全/隐私保护
新一代HIS源码医院信息系统一体化程序解决方案——大型
BS架构的医疗信息系统HIS源码,兼容全浏览器与移动终端;覆盖门诊、住院、EMR、药房等全业务场景;支持医保及LIS/PACS等系统对接;采用Spring Cloud+Vue微服务架构,保障高并发与金融级数据安全。
|
30天前
|
SQL 人工智能 自然语言处理
我用DataClaw打造了一个7X24小时的数据助理
阿里云DMS DataClaw是7×24小时AI数据助理,支持自然语言提工单、智能巡检、多任务编排、SQL风险预审等9项硬功能,原生集成DMS安全体系,覆盖MySQL/Oracle等60+数据源。现在可免费试用,快来体验吧。
657 10
|
30天前
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2026 年 2 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要。
|
2月前
|
存储 NoSQL 前端开发
告别踩坑!若依图片验证码实现与改造指南
若依(RuoYi)框架中图片验证码的完整实现逻辑、核心代码和定制化方法,我会从实现原理、核心代码拆解、关键配置、定制化改造四个维度讲解,覆盖验证码生成、存储、校验全流程,让你既能理解原理,也能按需修改验证码样式 / 规则。
213 10
|
2月前
|
缓存 NoSQL Java
若依(RuoYi)框架性能核心:Redis 作用与场景全解析
若依(RuoYi)框架中 Redis 的核心作用、具体应用场景和关键配置逻辑,我会从核心作用分类、实战应用场景、关键配置、优化建议四个维度拆解,覆盖单体版和微服务版的通用逻辑,让你清楚 Redis 在若依中 “做什么、怎么做、怎么优化”
358 3
|
2月前
|
XML Java 应用服务中间件
一步到位!若依框架升级 Tomcat 最新版完整教程
若依(RuoYi)框架升级 Tomcat 到最新版本的完整流程,我会从升级前提、核心步骤、版本适配、避坑指南四个维度拆解,覆盖单体版(RuoYi-Vue)和微服务版(RuoYi-Cloud),确保升级后系统稳定运行
450 3
|
2月前
|
存储 Java 中间件
Java 虚拟线程:JDK21 轻量级并发革命
JDK21正式引入的虚拟线程是Java并发模型的革命性升级:轻量(百字节/个)、百万级可扩展、JVM自主调度、零OS上下文切换,完美解决传统平台线程内存高、并发低、调优难痛点,尤其适用于IO密集型微服务与网关场景。
323 3
|
4月前
|
Java 大数据 Apache
Excel工具-HUTOOL-输出Excel
Hutool基于Apache POI封装了Excel读写功能,提供ExcelWriter和BigExcelWriter类,支持写出List、Map、Bean等数据类型到Excel,可自定义样式、多sheet操作,并解决大数据量导出时的内存溢出问题,适用于文件导出、客户端下载等场景。