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

简介: 若依(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天前
|
人工智能 自然语言处理 JavaScript
2026年Windows+Ollama本地部署OpenClaw保姆级教程:本地AI Agent+阿里云上快速搭建
2026年OpenClaw凭借本地部署、私有化运行的特性,成为打造个人智能体的核心工具,而Ollama作为轻量级本地大模型管理工具,能让OpenClaw摆脱对云端大模型的依赖,实现**本地推理、数据不泄露、全流程私有化**的智能体验。本文基于Windows 11系统,从硬件环境准备、Ollama安装与模型定制、OpenClaw部署配置、技能扩展到常见问题排查,打造保姆级本地部署教程,同时补充阿里云OpenClaw(Clawdbot)快速部署步骤,兼顾本地私有化需求与云端7×24小时运行需求,文中所有代码命令均可直接复制执行,确保零基础用户也能快速搭建属于自己的本地智能体。
4200 18
|
9天前
|
存储 人工智能 负载均衡
阿里云OpenClaw多Agent实战宝典:从极速部署到AI团队搭建,一个人=一支高效军团
在AI自动化时代,单一Agent的“全能模式”早已无法满足复杂任务需求——记忆臃肿导致响应迟缓、上下文污染引发逻辑冲突、无关信息加载造成Token浪费,这些痛点让OpenClaw的潜力大打折扣。而多Agent架构的出现,彻底改变了这一现状:通过“单Gateway+多分身”模式,让一个Bot在不同场景下切换独立“大脑”,如同组建一支分工明确的AI团队,实现创意、写作、编码、数据分析等任务的高效协同。
3587 27
|
13天前
|
人工智能 自然语言处理 监控
OpenClaw skills重构量化交易逻辑:部署+AI全自动炒股指南(2026终极版)
2026年,AI Agent领域最震撼的突破来自OpenClaw(原Clawdbot)——这个能自主规划、执行任务的智能体,用50美元启动资金创造了48小时滚雪球至2980美元的奇迹,收益率高达5860%。其核心逻辑堪称教科书级:每10分钟扫描Polymarket近千个预测市场,借助Claude API深度推理,交叉验证NOAA天气数据、体育伤病报告、加密货币链上情绪等多维度信息,捕捉8%以上的定价偏差,再通过凯利准则将单仓位严格控制在总资金6%以内,实现低风险高频套利。
7181 62
|
3天前
|
人工智能 JSON JavaScript
手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人
手把手教你用 OpenClaw(v2026.2.22-2)+ 飞书,10分钟零代码搭建专属AI机器人!内置飞书插件,无需额外安装;支持Claude等主流模型,命令行一键配置。告别复杂开发,像聊同事一样自然对话。
1555 5
手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人
|
3天前
|
人工智能 网络安全 数据安全/隐私保护
Docker部署OpenClaw(Clawdbot)攻略+阿里云部署OpenClaw 2026版教程
OpenClaw(前身为Clawdbot、Moltbot)作为一款高性能的AI代理平台,凭借自然语言驱动的任务自动化、多平台无缝协作、轻量化容器化架构等核心优势,成为2026年办公自动化、智能协作、跨端指令执行的主流工具,可实现邮件处理、日程管理、航班值机、多IM平台消息联动等丰富功能,无需复杂开发即可快速搭建专属AI助手。Docker作为轻量级容器化技术,能完美解决OpenClaw部署过程中的环境冲突、依赖配置、跨平台兼容等问题,实现一键搭建、快速启动、灵活迁移的部署体验。
1123 2
|
1月前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
46269 159
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
4天前
|
存储 人工智能 BI
2026年OpenClaw(Clawdbot)极简部署:接入小红书全自动运营,一个人=一支团队
2026年的小红书运营赛道,AI自动化工具已成为核心竞争力。OpenClaw(原Clawdbot)凭借“Skill插件化集成、全流程自动化、跨平台联动”的核心优势,彻底颠覆传统运营模式——从热点追踪、文案创作、封面设计到自动发布、账号互动,仅需一句自然语言指令,即可实现全链路闭环。而阿里云作为OpenClaw官方推荐的云端部署载体,2026年推出专属秒级部署方案,预装全套运行环境与小红书运营插件,让零基础用户也能10分钟完成部署,轻松拥有7×24小时在线的“专属运营团队”。
1312 6
|
8天前
|
人工智能 自然语言处理 安全
2026年OpenClaw Skills安装指南:Top20必装清单+阿里云上部署实操(附代码命令)
OpenClaw(原Clawdbot)的强大之处,不仅在于其开源免费的AI执行引擎核心,更在于其庞大的Skills生态——截至2026年2月,官方技能市场ClawHub已收录1700+各类技能插件,覆盖办公自动化、智能交互、生活服务等全场景。但对新手而言,面对海量技能往往无从下手,盲目安装不仅导致功能冗余,还可能引发权限冲突与安全风险。
1965 9
|
5天前
|
人工智能 JavaScript API
2026年Windows系统本地部署OpenClaw指南:附阿里云简易部署OpenClaw方案,零技术基础也能玩转AI助手
在AI办公自动化全面普及的2026年,OpenClaw(原Clawdbot、Moltbot)凭借“自然语言指令操控、多任务自动化执行、多工具无缝集成”的核心优势,成为个人与轻量办公群体打造专属AI助手的首选。它彻底打破了传统AI“只会对话不会执行”的局限——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可灵活接入通义千问、OpenAI等云端API,或利用本地GPU运行模型,真正实现“聊天框里办大事”。
1232 2

热门文章

最新文章