SpringMVC高能笔记,多个拦截器的执行

196 阅读2分钟

多个拦截器的执行

项目:interceptor2。在项目 interceptor 基础上修改。

(1) 再定义一个拦截器

image.png

(2) 多个拦截器的注册与执行

image.png

(3) 控制台执行结果

image.png

当有多个拦截器时,形成拦截器链。拦截器链的执行顺序,与其注册顺序一致。需要再次强调一点的是,当某一个拦截器的 preHandle()方法返回true 并被执行到时,会向一个专门的方法栈中放入该拦截器的 afterCompletion() 方法。

多个拦截器中方法与处理器方法的执行顺序如下图:

image.png  

从图中可以看出,只要有一个preHandle()方法返回false,则上部的执行链将被断开,其后续的处理器方法与postHandle()方法将无法执行。但,无论执行链执行情况怎样,只要方法栈中有方法,即执行链中只要有 preHandle()方法返回true,就会执行方法栈中的afterCompletion()方法。最终都会给出响应。

权限拦截器举例

只有经过登录的用户方可访问处理器,否则,将返回“无权访问”提示。本例的登录,由一个JSP 页面完成。即在该页面里将用户信息放入session中。也就是说,只要访问过该页面,就说明登录了。没访问过,则为未登录用户。

项目:interceptor_permission。在项目 interceptor1 基础上修改。

(1) 修改 index 页面

image.png

(2) 定义 Controller

image.png

(3) 定义 welcome 页面

image.png

(4) 定义权限拦截器

当preHandle()方法返回false 时,需要使用 request 或 response 对请求进行响应。

image.png

(5) 定义 fail 页面

image.png

(6) 注册权限拦截器

image.png

(7) 定义 login 页面

image.png

(8) 定义 logout 页面

image.png

(9) 项目测试

Step1:在地址栏先直接提交system.do 请求

image.png

Step2:访问login.jsp,进行用户登录

image.png

Step3:再次提交system.do 请求

image.png

Step4:访问logout.jsp,进行用户退出

image.png

Step5:三次提交system.do 请求

image.png