• 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 这个抽象类了,

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

  • 相关阅读:
    从属性文件中读取配置
    Page Object Manager
    在Selenium中使用JavaScriptExecutor处理Ajax调用?
    wait
    常用操作
    Selenium收藏官方网址
    PageObject样例
    解决办法-错误:Access denied for user 'root'@'localhost'
    Struts2中的OGNL详解
    用C++,调用浏览器打开一个网页
  • 原文地址:https://www.cnblogs.com/zr520/p/5092802.html
Copyright © 2020-2023  润新知