zoukankan      html  css  js  c++  java
  • 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 这个抽象类了,

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

  • 相关阅读:
    验证一下spark Row getAS类型以及控制问题
    Spark异常处理有时间好好拜读一下,spark拍错好文章
    Hive SQL 报错
    Objenesis类库学习一下,没有符合的构造器也可以创建对象
    Scala可变参数方法或者函数传参问题
    大数据相关英文博客,感觉还不错。Mark一下http://dwgeek.com/
    Tomcat 7 'javax.el.ELException' 的解决方式(failed to parse the expression [${xxx}])
    The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar
    在Tomcat中进行数据池连接是所需的包
    EL表达式
  • 原文地址:https://www.cnblogs.com/zr520/p/5092802.html
Copyright © 2011-2022 走看看