欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring MVC(六)拦截器

程序员文章站 2022-07-09 22:42:27
...

一 介绍

public interface HandlerInterceptor {
    boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;

    void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception;

    void afterCompletion(HttpServletRequest var1, HttpServletResponse var2, Object var3, Exception var4) throws Exception;
}

HandlerInterceptor接口 ,有3个方法:
preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如我们上一章的Controller实现);
返回值:

  • true表示继续流程(如调用下一个拦截器或处理器);
  • false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;

postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。

afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。


拦截器总结

  1. 在preHandler中return false,则postHandle、afterCompletion都不会执行
  2. 在handler中抛出异常,则afterCompletion会执行,postHandle不执行(无论是否有ExceptionHandler)
  3. 正常运行,则postHandle、afterCompletion两个方法都会执行。

适配器

有时候我们可能只需要实现三个回调方法中的某一个,如果实现HandlerInterceptor接口的话,三个方法必须实现,不管你需不需要,此时spring提供了一个HandlerInterceptorAdapter适配器(一种适配器设计模式的实现-接口适配器模式),允许我们只实现需要的回调方法。

public abstract class HandlerInterceptorAdapter implements HandlerInterceptor {  
     //省略代码 此处所以三个回调方法都是空实现,preHandle返回true。  
}  

二 运行流程

正常流程
Spring MVC(六)拦截器


中断流程
Spring MVC(六)拦截器

三 实践

代码实现

public class HandlerInterceptor1 extends HandlerInterceptorAdapter {//此处一般继承HandlerInterceptorAdapter适配器即可  
    @Override  
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {  
        System.out.println("===========HandlerInterceptor1 preHandle");  
        return true;  
    }  
    @Override  
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {  
        System.out.println("===========HandlerInterceptor1 postHandle");  
    }  
    @Override  
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {  
        System.out.println("===========HandlerInterceptor1 afterCompletion");  
    }  
}  

配置

<bean name="/test" class="cn.javass.chapter5.web.controller.TestController"/>  
<bean id="handlerInterceptor1"   
class="cn.javass.chapter5.web.interceptor.HandlerInterceptor1"/>  
<bean id="handlerInterceptor2"   
class="cn.javass.chapter5.web.interceptor.HandlerInterceptor2"/>  



<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">  
    <property name="interceptors">  
        <list>  
           <ref bean="handlerInterceptor1"/>  
          <ref bean="handlerInterceptor2"/>  
        </list>  
    </property>  
</bean>  

参考

  1. https://jinnianshilongnian.iteye.com/blog/1670856
相关标签: 拦截器