Spring MVC HandlerInterceptor拦截器
HandlerInterceptor 用于拦截控制器方法的执行,在请求到达控制器前后及视图渲染后插入自定义处理逻辑。
接口定义
Java
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
}
}
三个回调方法
| 方法 | 执行时机 | 返回值作用 |
|---|---|---|
| preHandle | 控制器方法执行前 | true放行,false拦截 |
| postHandle | 控制器方法执行后,视图渲染前 | 无返回值 |
| afterCompletion | 视图渲染完成后 | 无返回值 |
自定义拦截器实现
Java
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if (user == null) {
response.sendRedirect("/login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
// 可修改ModelAndView
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
// 资源清理、异常日志记录
}
}
注册拦截器
Java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/login", "/static/**");
}
}
执行顺序
多个拦截器按注册顺序执行:
- preHandle:正序执行
- postHandle、afterCompletion:逆序执行
拦截器只能拦截控制器方法,无法拦截静态资源请求(需在注册时排除)。
要点总结
- preHandle 返回 false 可中断请求链
- 拦截器通过 WebMvcConfigurer 注册
- 通过 addPathPatterns/excludePathPatterns 配置拦截路径
- 多个拦截器按注册顺序形成责任链
📝 发现内容有误?点击此处直接编辑