HandlerInterceptor

HandlerInterceptor 是 Spring MVC 框架中的一个接口,主要用于在处理 HTTP 请求的不同阶段进行拦截和处理。它类似于 Servlet 过滤器,但作用范围更加精细,可以在请求到达控制器之前、请求处理之后以及视图渲染之前进行拦截。

HandlerInterceptor 主要有三个方法:

  1. preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)

    • 在请求被处理之前调用。通常用于做一些前置的处理逻辑,比如身份验证、权限检查或记录日志等。
    • 如果返回 true,则请求继续向下执行。如果返回 false,则中止请求的后续处理。
  2. postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)

    • 在请求处理完后、视图渲染之前调用。可以在这里修改 ModelAndView,对返回的视图或数据进行进一步的调整。
    • 适用于添加一些通用的模型数据或者修改返回的视图等。
  3. afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

    • 在视图渲染完成之后调用。通常用于进行资源清理、日志记录等操作。
    • 不管请求是否发生异常,这个方法都会执行,因此特别适合用于做最终的清理工作。

常见使用场景

  • 权限验证:可以在 preHandle 中拦截未经授权的请求。
  • 性能监控:在 preHandle 中记录请求的开始时间,在 afterCompletion 中计算总耗时。
  • 日志记录:记录请求的详细信息,如访问的 URL、请求参数、响应状态等。

要使用 HandlerInterceptor,你需要实现它并在 Spring 配置中注册。通常通过实现 WebMvcConfigurer 接口的 addInterceptors 方法来添加自定义的拦截器。

示例

public class MyInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 处理前逻辑
        System.out.println("preHandle: 拦截请求前的处理逻辑");
        return true; // 返回 false 则终止请求处理
    }
    
    @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: 请求完成后的逻辑");
    }
}

然后在 Spring 配置中注册:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor());
    }
}

通过这样配置,MyInterceptor 就会在请求处理的各个阶段生效。

preHandle()调用位置

DispatcherServlet
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值