











拦截器、过滤器与全局配置
在 Spring Boot 项目中,拦截器(Interceptor)、过滤器(Filter)与全局配置共同构成了请求处理链路中的关键环节。合理使用它们,可以在不侵入业务代码的前提下完成登录校验、日志记录、跨域处理、参数清洗等通用逻辑。
1. 过滤器(Filter)
过滤器是 Servlet 规范中的组件,作用于请求进入 Servlet 之前与响应返回之后,适合处理与协议层相关的通用逻辑。
java
@Component
public class RequestLogFilter implements Filter {
private static final Logger log = LoggerFactory.getLogger(RequestLogFilter.class);
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
long start = System.currentTimeMillis();
chain.doFilter(request, response);
long cost = System.currentTimeMillis() - start;
log.info("请求处理耗时:{} ms", cost);
}
}
2. 拦截器(Interceptor)
拦截器是 Spring MVC 提供的组件,作用于 Controller 方法调用前后,可以拿到 HandlerMethod,适合做权限校验、参数校验、接口幂等等业务级逻辑。
java
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String token = request.getHeader("Authorization");
if (token == null || token.isEmpty()) {
response.setStatus(HttpStatus.UNAUTHORIZED.value());
return false;
}
// 这里可以解析 token、校验用户身份
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 请求处理完成后、视图渲染前执行
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
// 整个请求结束后执行,适合释放资源、记录日志
}
}
3. 全局配置类
通过实现 WebMvcConfigurer,可以统一注册拦截器、配置跨域、静态资源映射等。
java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Resource
private AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptor)
.addPathPatterns("/api/**")
.excludePathPatterns("/api/login", "/api/register");
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
4. 过滤器与拦截器的区别
| 对比项 | 过滤器(Filter) | 拦截器(Interceptor) |
|---|---|---|
| 规范来源 | Servlet 规范 | Spring MVC 规范 |
| 作用范围 | 所有请求,包括静态资源 | 仅作用于 Controller 方法 |
| 依赖容器 | 依赖 Servlet 容器 | 依赖 Spring 容器,可注入 Bean |
| 执行时机 | 请求进入 Servlet 之前 | Controller 方法调用前后 |
| 典型场景 | 编码处理、跨域、日志 | 登录校验、权限控制、幂等校验 |
5. 全局异常处理
配合 @RestControllerAdvice 可以统一处理业务异常,避免在每个 Controller 中重复编写 try-catch。
java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ResponseEntity<Result<Void>> handleBusinessException(BusinessException e) {
return ResponseEntity.ok(Result.fail(e.getCode(), e.getMessage()));
}
@ExceptionHandler(Exception.class)
public ResponseEntity<Result<Void>> handleException(Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Result.fail(500, "系统繁忙,请稍后重试"));
}
}
通过以上组合,可以在项目中形成「过滤器做协议层处理 → 拦截器做业务层校验 → 全局异常处理兜底」的完整请求链路,让业务代码保持简洁、职责清晰。




6. CORS 跨域设置
前后端分离架构下,前端与后端往往部署在不同域名或端口,浏览器会触发跨域请求。Spring Boot 提供了多种方式配置 CORS(Cross-Origin Resource Sharing),下面介绍几种常用方案。
6.1 全局配置类方式
在 WebConfig 中重写 addCorsMappings 方法,统一配置跨域规则,适合全局生效的场景。
java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("http://localhost:8080", "https://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*")
.allowCredentials(true)
.maxAge(3600);
}
}
6.2 注解方式
在具体的 Controller 或方法上使用 @CrossOrigin 注解,适合局部开启跨域的场景。
java
@RestController
@RequestMapping("/api/user")
@CrossOrigin(origins = "http://localhost:8080", maxAge = 3600)
public class UserController {
@GetMapping("/info")
public Result<UserInfo> getUserInfo() {
// 业务逻辑
return Result.success(userInfo);
}
}
6.3 过滤器方式
通过自定义 Filter 手动设置响应头,适合需要精细控制响应头的场景。
java
@Component
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse) response;
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
res.setHeader("Access-Control-Allow-Headers", "*");
res.setHeader("Access-Control-Max-Age", "3600");
if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) request).getMethod())) {
res.setStatus(HttpServletResponse.SC_OK);
return;
}
chain.doFilter(request, response);
}
}
6.4 配置注意事项
allowedOriginPatterns支持通配符,如"*"表示允许所有来源;但开启allowCredentials(true)时,"*"通配符会被浏览器拒绝,需明确指定来源。OPTIONS预检请求需要被正确处理,否则跨域请求会失败。- 生产环境建议将
allowedOriginPatterns限定为实际的前端域名,避免安全风险。 - 若同时配置了过滤器与拦截器,需注意 CORS 响应头在过滤器阶段就要写入,否则拦截器校验可能拿不到跨域信息。
通过以上方式,可以灵活地为项目配置 CORS 跨域策略,满足前后端分离开发与部署的需求。