Skip to content
DAILY QUOTE

“ ”

跨域拦截器

具体方式

CorsFilter @CrossOrigin addCorsMappings(CorsRegistry registry)

其中: addCorsMappings 是实现 WebMvcConfigurer 时配置全局 CORS 规则的方法。

示例:

java
  @Configuration
  public class MvcConfiguration implements WebMvcConfigurer {

      @Override
      public void addCorsMappings(CorsRegistry registry) {
          registry.addMapping("/**")
                  .allowedOrigins("http://localhost:5173")
                  .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
                  .allowedHeaders("*")
                  .allowCredentials(true);
      }
  }

它和 @CrossOrigin 的区别是:

  • @CrossOrigin:写在 Controller 或方法上,局部生效
  • addCorsMappings:全局配置,统一管理
  • CorsFilter:更靠前的 Servlet Filter 层处理,优先级更高

职责

处理浏览器的 CORS协议。它负责在 HTTP 响应头里盖上 Access-Control-Allow-Origin 等印章,告诉浏览器:“这个来源是安全的,允许读取数据。

执行时机: 处于请求链路的最前端。它甚至在请求还没到达你写的 Controller 之前,就先处理浏览器的 OPTIONS 预检请求。

判断依据:仅仅通过请求头中的 Origin 字段进行字符串比对,不涉及任何业务逻辑。

在使用完nginx反向代理后,由于前后端实现了同源,跨域拦截器就完成了自己的使命,不需要了。

业务拦截器

具体方式

HandlerInterceptor addInterceptors(InterceptorRegistry registry)

其中: addInterceptors 是把你写好的 HandlerInterceptor 注册到 Spring MVC 里的方法。

示例:

java
@Configuration
public class MvcConfiguration implements WebMvcConfigurer {

    private final LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/login", "/register");
    }
}

它负责告诉 Spring MVC:

哪个拦截器生效 拦哪些路径 放行哪些路径 多个拦截器顺序是什么

职责

  1. 检查 Header 里是否带有合法的 Token
  2. 判断当前用户是否有权访问特定接口
  3. 记录用户操作轨迹

执行时机:位于 Spring MVC 内部。只有当请求通过了跨域校验、路由匹配成功后,才会进入 Interceptor。

技术特性:可以通过HandlerMethod获取到目标方法上的自定义注解,从而实现灵活的拦截逻辑

与AOP区别:拦截器是全局的、粗粒度控制,而AOP是细粒度,针对特定方法的逻辑增强

总结

请求进入服务器,按以下顺序进行

阶段拦截组件关注内容失败后果
第一关:安全协议CORS 拦截请求头 Origin 是否在白名单?浏览器报错,前端拿不到数据
第二关:业务身份业务拦截器是否登录?是否有 Token?返回 401 Unauthorized
第三关:精细控制AOP 切面IP 频率是否超限?(限流)返回 429 Too Many Requests