温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

拦截器能拦截静态资源吗

发布时间:2026-08-30 06:48:43 来源:亿速云 阅读:92 作者:小樊 栏目:编程语言

结论先行:一般可以,但取决于你用的是哪个框架、拦截器的实现方式以及静态资源的访问路径配置。
下面按常见场景说明。


一、Spring MVC(最常见)

✅ 默认情况

Spring MVC 的拦截器(HandlerInterceptor)默认不会拦截静态资源。

原因:

  • 静态资源(/js/**/css/**/**/*.html 等)
  • 通常由 ResourceHttpRequestHandler 处理
  • 不经过 DispatcherServlet 的 HandlerMapping
  • 所以 HandlerInterceptor 不会生效

✅ 什么情况下会拦截静态资源?

1️⃣ 你手动开启了 /** 拦截

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MyInterceptor())
            .addPathPatterns("/**"); // 包括静态资源
}

但仍然是否生效取决于资源是否被 DispatcherServlet 处理


2️⃣ 你关闭了默认的静态资源映射,或自己重写规则

如:

spring.mvc.static-path-pattern=/static/**

或自定义 WebMvcConfigurer 时处理不当。


3️⃣ 静态资源被你自己写 Controller 接管

@GetMapping("/static/test.js")
public void test() {}

✅ 会被拦截(因为走了 DispatcherServlet)。


二、Servlet Filter(过滤器)

✅ Filter 一定会拦截静态资源

原因:

  • Filter 工作在 Servlet 容器层
  • 不管是不是静态资源,只要请求进来就会经过 Filter
@WebFilter("/*")
public class MyFilter implements Filter {
}

⚠️ 注意:

  • Filter 不是 Spring MVC 的拦截器
  • 更早执行
  • 不能获取 HandlerMethod

三、Spring Boot 2.6+ / Spring 6 的变化

  • 默认静态资源仍不进 DispatcherServlet
  • 拦截器逻辑基本不变
  • 推荐显式排除静态资源:
registry.addInterceptor(new MyInterceptor())
        .addPathPatterns("/api/**")
        .excludePathPatterns(
            "/css/**",
            "/js/**",
            "/images/**",
            "/**/*.html"
        );

四、总结对照表

技术 是否拦截静态资源 说明
HandlerInterceptor ❌ 默认不拦截 除非特殊配置
Filter ✅ 拦截 所有请求
Spring Security ✅ 拦截 安全过滤
自己写 Controller 返回静态资源 ✅ 拦截 属于业务请求

五、一句话总结

Spring MVC 拦截器默认不拦截静态资源;
如果你看到它被拦截了,多半是 Filter 或路径配置问题。

如果你能告诉我:

  • 用的是 Spring Boot 哪个版本
  • 拦截器 / Filter / Spring Security
  • 静态资源访问路径

我可以帮你精确判断,并给出最优配置示例

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI