springmvc(3)拦截器HandlerInterceptor源码的简单解析

其实拦截器就是我们的AOP编程。拦截器在我们的实际项目中实用性比较大的,比如:日志记录,权限过滤,身份验证,性能监控等等。下面就简单的来研究一下拦截器:

public interface HandlerInterceptor {
   

  //在处理器适配器执行前调用 前面讲过 为各种处理器适配 通俗的讲意思就是说在执行controller的方法
  //之前执行,返回true或者是false,true代表的是执行和面的逻辑,即执行后面的处理器或者拦截器

   boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception;

    //在执行完适配的调用方法后,生成视图之前执行,官方是这样解析的:
    // but before the DispatcherServlet renders the view.

    void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
            throws Exception;
  //在所以的操作以后执行
    void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception;

很明显的看出来这是一个接口,我们在平时使用的时候,也是直接实现接口的方式的,具体每一个方法的作用也都将了一下,为了更好了理解这几个方法调用的时机,我们来进行测试一下:

拦截器:

public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("<===========preHandle=============>"+System.currentTimeMillis());
        return true;
    }
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("<===========postHandle=============>"+System.currentTimeMillis());
        
    }
    
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("<===========afterCompletion=============>"+System.currentTimeMillis());
        
    }

controller:

protected ModelAndView handleRequestInternal(HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        ModelAndView mv=new ModelAndView();
        System.out.println("Controller"+System.currentTimeMillis());
        mv.setViewName("index");
        return mv;
    }

jsp:

<%
long endTime=System.currentTimeMillis();
System.out.println("Jsp:"+endTime);
%>

执行完以后控制台打印:

<===========preHandle=============>1451574182055
Controller1451574182055
<===========postHandle=============>1451574182055
Jsp:1451574182179
<===========afterCompletion=============>1451574182179

这也验证了上面说法。

也许会有这样的疑惑,业务需求可能只需要继承一个方法,那怎么办,看其他几个比较烦人(处女座)。这时候我们就可以通过继承HandlerInterceptorAdapter 这个抽象类了,

这个不用解释了吧,你可以选择继承任意几个来完成自己的业务逻辑。

原文地址:https://www.cnblogs.com/zr520/p/5092802.html