本文链接: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

最新文章

  1. 第2章 新手必须掌握的Linux命令
  2. canvas弹动
  3. 【Alpha版本】冲刺-Day2
  4. android 中通过代码创建控件
  5. Python串口编程
  6. A Simple Problem with Integers poj 3468 多树状数组解决区间修改问题。
  7. 开发设计模式(八)抽象工厂模式(Abstract Factory Pattern)
  8. 关于redis 缓存的问题
  9. CentOS 7安装Oracle 11gR2以及设置自启动
  10. 【USACO】AC自动机
  11. 超精简易用cocoaPods的安装和使用
  12. Python———pandas数据处理
  13. 【转】git - 简易指南
  14. Fiddler中显示IP方法
  15. Bootstrap模态框(一个页面显示多个)的使用
  16. JUnit Parametrized Tests
  17. DLL导出类避免地狱问题的完美解决方案
  18. grep 正则表达
  19. 理解 Memory barrier(内存屏障)【转】
  20. hash入门

热门文章

  1. python3快速安装升级pip3
  2. 1.sql统计语句
  3. java EE学习之数据库操作
  4. Java内存模型学习笔记(一)—— 基础
  5. LCD驱动的学习
  6. 使用pandoc制作幻灯片
  7. PE重装系统
  8. Django之过滤器
  9. Spark foreachpartiton和mappartition的异同
  10. css详解2