拦截器Interceptor学习

本文详细介绍了如何在Spring MVC中配置自定义拦截器,包括创建拦截器类、实现HandlerInterceptor接口以及通过Java或XML配置拦截器。同时,阐述了拦截器的执行流程,包括preHandle、postHandle和afterCompletion方法的作用及执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拦截器配置
一、创建我们自己的拦截器类并实现HandlerInterceptor接口。

@Component
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

HandlerInterceptor接口的三个方法:

preHandle方法:在请求controller方法之前调用,这里就可以做一些session对象的校验及写入ThreadLocal方便方法调用等。只有这个方法返回true,请求才能继续下去。

postHandle方法:这个方法是在请求了controller方法之后但在视图渲染之前调用的。这里可以去做ThreadLocal中资源的清除。

afterCompletion方法:这个方法是在整个请求结束之后调用的,也就是在Dispatcher渲染整个视图之后进行的,主要进行资源清理工作。(这里也是去补偿了ThreadLocal中资源的清除)。

二、创建一个Java类继承WebMvcConfigurerAdapter,并重写addInterceptors方法
实例化我们自定义的拦截器,然后将对象手动添加到拦截器链中。
1.java配置

@Component
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Autowired
    private MyInterceptor myInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor).addPathPatterns("拦截路径");
    }
}

2.xml配置

<mvc:interceptors>  
    <!-- 使用 bean声明定义一个Interceptor,但是如果是直接定义在 mvc:interceptors 下面的 Interceptor将会拦截所有的请求 -->  
    <!--<bean class="自定义拦截器类"/> -->
    <mvc:interceptor>  
        <!--定义在这里的拦截器将会拦截特定的请求-->
        <mvc:mapping path="拦截请求"/>  
        <bean class="自定义拦截器类"/>  
    </mvc:interceptor>  
</mvc:interceptors>  

拦截器的执行流程
一、单个拦截器执行流程
在这里插入图片描述
总结:
1.程序先执行preHandle()方法,如果该方法的返回值为true,则程序会继续向下执行处理器中的方法,否则将不再向下执行。

2.在业务处理器(即控制器Controller类)处理完请求后,会执行postHandle()方法,然后会通过DispatcherServlet向客户端返回响应。

3.在DispatcherServlet处理完请求后,才会执行afterCompletion()方法。

二、多个拦截器的执行流程
在这里插入图片描述
总结:多个拦截器执行时,它们的preHandle()方法会按照配置文件中拦截器的配置顺序执行,而它们的postHandle()方法和afterCompletion()方法则会按照配置顺序的反序执行。

拦截器缺点
拦截器依赖web框架,实现上基于Java的反射机制,只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

参考:https://www.cnblogs.com/black-spike/p/7813238.html
https://blog.youkuaiyun.com/zlj1217/article/details/82532510

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值