- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
多个拦截器的执行
项目:interceptor2。在项目 interceptor 基础上修改。
(1) 再定义一个拦截器
(2) 多个拦截器的注册与执行
(3) 控制台执行结果
当有多个拦截器时,形成拦截器链。拦截器链的执行顺序,与其注册顺序一致。需要再次强调一点的是,当某一个拦截器的 preHandle()方法返回true 并被执行到时,会向一个专门的方法栈中放入该拦截器的 afterCompletion() 方法。
多个拦截器中方法与处理器方法的执行顺序如下图:
从图中可以看出,只要有一个preHandle()方法返回false,则上部的执行链将被断开,其后续的处理器方法与postHandle()方法将无法执行。但,无论执行链执行情况怎样,只要方法栈中有方法,即执行链中只要有 preHandle()方法返回true,就会执行方法栈中的afterCompletion()方法。最终都会给出响应。

权限拦截器举例
只有经过登录的用户方可访问处理器,否则,将返回“无权访问”提示。本例的登录,由一个JSP 页面完成。即在该页面里将用户信息放入session中。也就是说,只要访问过该页面,就说明登录了。没访问过,则为未登录用户。
项目:interceptor_permission。在项目 interceptor1 基础上修改。
(1) 修改 index 页面
(2) 定义 Controller
(3) 定义 welcome 页面
(4) 定义权限拦截器
当preHandle()方法返回false 时,需要使用 request 或 response 对请求进行响应。
(5) 定义 fail 页面
(6) 注册权限拦截器
(7) 定义 login 页面
(8) 定义 logout 页面
(9) 项目测试
Step1:在地址栏先直接提交system.do 请求
Step2:访问login.jsp,进行用户登录
Step3:再次提交system.do 请求
Step4:访问logout.jsp,进行用户退出
Step5:三次提交system.do 请求