跨域拦截器
具体方式
CorsFilter @CrossOrigin addCorsMappings(CorsRegistry registry)
其中: addCorsMappings 是实现 WebMvcConfigurer 时配置全局 CORS 规则的方法。
示例:
@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 里的方法。
示例:
@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:
哪个拦截器生效 拦哪些路径 放行哪些路径 多个拦截器顺序是什么
职责
- 检查 Header 里是否带有合法的 Token
- 判断当前用户是否有权访问特定接口
- 记录用户操作轨迹
执行时机:位于 Spring MVC 内部。只有当请求通过了跨域校验、路由匹配成功后,才会进入 Interceptor。
技术特性:可以通过HandlerMethod获取到目标方法上的自定义注解,从而实现灵活的拦截逻辑
与AOP区别:拦截器是全局的、粗粒度控制,而AOP是细粒度,针对特定方法的逻辑增强
总结
请求进入服务器,按以下顺序进行
| 阶段 | 拦截组件 | 关注内容 | 失败后果 |
|---|---|---|---|
| 第一关:安全协议 | CORS 拦截 | 请求头 Origin 是否在白名单? | 浏览器报错,前端拿不到数据 |
| 第二关:业务身份 | 业务拦截器 | 是否登录?是否有 Token? | 返回 401 Unauthorized |
| 第三关:精细控制 | AOP 切面 | IP 频率是否超限?(限流) | 返回 429 Too Many Requests |