全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-18 8 分钟 ✍️ juanwangdev

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 配置拦截路径
  • 多个拦截器按注册顺序形成责任链

📝 发现内容有误?点击此处直接编辑

← 上一篇 Spring MVC HandlerExceptionResolver异常解析器
下一篇 → Spring MVC 自定义MessageConverter消息转换器
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库