在 Spring(Spring MVC / Spring Boot) 中,拦截器(Interceptor) 用来在请求到达 Controller 之前 / 之后 / 完成时 做一些通用处理,比如:
登录校验、权限验证、日志记录、接口耗时统计等。
请求 → 拦截器 preHandle → Controller → 拦截器 postHandle → 视图渲染 → afterCompletion
✅ 和 过滤器(Filter) 不同,拦截器是 Spring MVC 层 的,能拿到 HandlerMethod、ModelAndView 等。
实现 HandlerInterceptor 接口(或继承 HandlerInterceptorAdapter):
public class MyInterceptor implements HandlerInterceptor {
// 在 Controller 方法执行前调用
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("preHandle");
return true; // true 放行,false 拦截
}
// Controller 执行后,视图渲染前
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
// 整个请求完成后(常用于资源清理、记录日志)
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/api/**") // 拦截路径
.excludePathPatterns("/api/login"); // 排除路径
}
}
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
Object user = request.getSession().getAttribute("user");
if (user == null) {
response.sendRedirect("/login");
return false;
}
return true;
}
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
request.setAttribute("startTime", System.currentTimeMillis());
return true;
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response,
Object handler,
Exception ex) {
Long start = (Long) request.getAttribute("startTime");
System.out.println("耗时:" + (System.currentTimeMillis() - start) + "ms");
}
if (handler instanceof HandlerMethod) {
// 只处理 Controller 方法
}
| 对比项 | 拦截器 | 过滤器 |
|---|---|---|
| 所属 | Spring MVC | Servlet |
| 是否能注入 Bean | ✅ | ❌ |
| 能拿到 Controller 信息 | ✅ | ❌ |
| 执行时机 | DispatcherServlet 之后 | 请求最前面 |
❌ 静态资源被拦截
✅ 排除路径或实现 WebMvcConfigurer
❌ 拦截器没生效
✅ 确保有 @Configuration 并注册
❌ 拦截器中使用 @Autowired 为空
✅ 拦截器要通过 Spring 管理(用 @Component 或 registry 注册)
Spring 拦截器 = Controller 前后统一处理逻辑
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。