zoukankan      html  css  js  c++  java
  • SpringMVC拦截器及多拦截器时的执行顺序

    本文链接:https://blog.csdn.net/itcats_cn/article/details/80371639
    拦截器的配置步骤

    springmvc.xml中配置多个拦截器
    配置自定义拦截器并实现接口
    <!-- 配置springmvc拦截器 -->
    <mvc:interceptors>

    <mvc:interceptor>
    <!-- 对什么url路径进行拦截 /**代表对全路径拦截 -->
    <mvc:mapping path="/**"/>
    <!-- 注入自定义拦截器到bean标签 -->
    <bean class="cn.itcats.ssm.interception.Inteceptor1" />
    </mvc:interceptor>

    <mvc:interceptor>
    <mvc:mapping path="/**"/>
    <bean class="cn.itcats.interception.Inteceptor2" />
    </mvc:interceptor>

    </mvc:interceptors>
     

    //拦截器1

    public class Inteceptor1 implements HandlerInterceptor{

    //方法执行前1
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
    //返回值boolean类型 决定是否放行
    System.out.println("方法执行前1");
    return true;
    }

    //方法执行后1
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
    System.out.println("方法执行后1");
    }

    //页面渲染后1
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
    System.out.println("页面渲染后1");
    }

    }
     

    //拦截器2
    public class Inteceptor2 implements HandlerInterceptor{

    //方法执行前2
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
    //返回值boolean类型 决定是否放行
    System.out.println("方法执行前2");
    return true;
    }

    //方法执行后2
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)throws Exception {
    System.out.println("方法执行后2");
    }

    //页面渲染后2
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)throws Exception {
    System.out.println("页面渲染后2");
    }

    }
     

    SpringMVC拦截器配置后,主要对三个过程进行拦截校验:

    方法执行前(有boolean返回值,返回true则放行)【Hanler执行之前】
    方法执行后【Handler执行之后,ModelAndView返回之前】
    页面渲染后【ModelAndView执行之后,对异常处理】
     

    多个拦截器执行顺序

        如有两个拦截器

        (1)方法执行前返回值都为true,则顺序如下

        方法执行前1   

        方法执行前2

        方法执行后2

        方法执行后1

        页面渲染后2

        页面渲染后1        

    方法1和方法2是相对的,取决于springmvc自定义拦截器类配置的先后顺序(这里是自定义拦截器1先于拦截器2)

    总结起来: 拦截器1中的方法执行前1先执行,后执行拦截器2中的方法执行前2方法,后拦截器2的方法先于拦截器1的方法执行

        (2)拦截器1中方法执行前1 返回值为false,而拦截器2中方法执行前2返回值为 true 执行顺序如下:

            方法执行前1    //此时被拦截,不放行

    总结起来:只执行拦截器1方法执行前的方法,当拦截器1方法执行前被拦截,返回值为false不被放行,后面的拦截器链都不执行,无论2的返回值是true还是false

         (3)拦截器1中方法执行前1 返回值为true,而拦截器2中方法执行前2返回值为 false  执行顺序如下:

            方法执行前1

            方法执行前2   //被拦截,不放行

            页面渲染后1

    总结执行顺序:

    preHandle按拦截器定义顺序调用
    postHandler按拦截器定义逆序调用
    afterCompletion按拦截器定义逆序调用
    postHandler在拦截器链内所有拦截器返成功调用
    afterCompletion只有preHandle返回true才调用
     

    如何让两个Interceptor有序执行呢?
    如果继承WebMvcConfigurationSupport,需要处理所有SpringMVC为我们提供的接口实现,所以我们继承WebMvcConfigurerAdapter,我们想要Interceptor顺序执行,重写addInterceptor()方法

    public void addInterceptors(InterceptorRegistry registry){
    registry.addInterceptor(authInterceptor).excludePathPatterns("/static").addPathPatterns("/**");
    registry
    .addInterceptor(authActionInterceptor).addPathPatterns("/house/toAdd")
    .addPathPatterns("/accounts/profile").addPathPatterns("/accounts/profileSubmit")
    .addPathPatterns("/house/bookmarked").addPathPatterns("/house/del")
    .addPathPatterns("/house/ownlist").addPathPatterns("/house/add")
    .addPathPatterns("/house/toAdd").addPathPatterns("/agency/agentMsg")
    .addPathPatterns("/comment/leaveComment").addPathPatterns("/comment/leaveBlogComment");
    super.addInterceptors(registry);

    ————————————————
    版权声明:本文为CSDN博主「itcats_cn」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/itcats_cn/article/details/80371639

  • 相关阅读:
    mac 配置 iterm2
    python面试题
    待办事项--flask
    八皇后问题c语言版(xcode下通过)
    对分布式一些理解
    观察者模式
    用redis实现悲观锁(后端语言以php为例)
    只用200行Go代码写一个自己的区块链!(转)
    php的生命周期的概述
    linux网络编程1 最简单的socket编程
  • 原文地址:https://www.cnblogs.com/renjiaqi/p/11834503.html
Copyright © 2011-2022 走看看