Spring Boot 统一功能处理:拦截器详解
一、拦截器核心概念
作用:拦截器是 Spring 框架提供的核心功能,用于在请求处理前后执行预定义逻辑,实现统一处理(如登录校验、日志记录等)。
核心方法:
public class LoginInterceptor implements HandlerInterceptor {// 目标方法执行前调用(核心控制点)@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {return true; // true=放行, false=拦截}// 目标方法执行后调用(Controller 方法执行完毕)@Overridepublic void postHandle(...) { ... }// 整个请求完成后的最终处理(视图渲染后)@Overridepublic void afterCompletion(...) { ... }
}
二、拦截器使用步骤
1. 定义拦截器
@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, ...) {// 登录校验示例HttpSession session = request.getSession(false);if (session == null || session.getAttribute("USER") == null) {response.setStatus(401); // 401 Unauthorizedreturn false; // 拦截请求}return true; // 放行}
}
2. 注册拦截器
@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**") // 拦截所有路径.excludePathPatterns("/login") // 排除登录接口.excludePathPatterns("/**/*.js") // 排除静态资源.excludePathPatterns("/**/*.css");}
}
三、拦截路径配置规则
路径模式 | 匹配示例 | 不匹配示例 |
---|---|---|
/* | /user , /book | /user/login |
/** | /user , /user/profile | - |
/book/* | /book/add , /book/detail | /book/1/author |
/book/** | /book , /book/1/author | /user/books |
四、拦截器执行流程
五、登录校验实战案例
1. 拦截器实现
public boolean preHandle(...) {if (request.getSession().getAttribute("USER") == null) {response.setStatus(401);return false;}return true;
}
2. 前端处理拦截
// AJAX 错误处理
$.ajax({error: function(error) {if (error.status === 401) {window.location.href = "/login.html"; // 跳转登录页}}
});
六、设计模式:适配器原理
拦截器底层实现:
// DispatcherServlet 核心代码
protected void doDispatch(...) {// 1. 获取拦截器链HandlerExecutionChain mappedHandler = getHandler(request);// 2. 执行 preHandle()if (!mappedHandler.applyPreHandle(request, response)) {return; // 拦截请求}// 3. 执行 Controller 方法mv = ha.handle(...);// 4. 执行 postHandle()mappedHandler.applyPostHandle(...);// 5. 渲染视图后执行 afterCompletion()processDispatchResult(...);
}
适配器模式应用:
-
HandlerAdapter
适配不同类型的控制器(如@Controller
、HttpRequestHandler
) -
解决不同处理器接口的兼容问题
七、最佳实践建议
-
路径排除:静态资源(JS/CSS/图片)必须排除
-
性能优化:在
preHandle()
中尽早返回拦截结果 -
异常处理:结合
@ControllerAdvice
统一处理拦截器抛出的异常 -
执行顺序:多个拦截器按注册顺序执行
preHandle()
,逆序执行postHandle()
-
生产建议:
-
登录拦截器排除
/login
,/health
等公开接口 -
敏感操作(如支付)使用独立拦截器增强校验
-
// 多拦截器配置示例
registry.addInterceptor(new LogInterceptor()).order(1);
registry.addInterceptor(new AuthInterceptor()).order(2);
总结核心价值
-
解耦:将通用逻辑(如鉴权)从业务代码剥离
-
复用:一次编写,全局生效
-
可维护:统一修改拦截逻辑,避免散弹式修改
-
安全:强制实施安全策略(如所有接口必须认证)
通过拦截器 + 统一返回格式 + 统一异常处理,可构建高可维护性的 Spring Boot 后端架构,