你的位置:首页 > Java教程

[Java教程]springmvc拦截器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=============>1451574182055Controller1451574182055<===========postHandle=============>1451574182055Jsp:1451574182179<===========afterCompletion=============>1451574182179

这也验证了上面说法。

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

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