定义拦截器
实现 HandlerInterceptor 接口,接口有三个重写方法:
- preHandle
- postHandle
- afterCompletion
public class HandleInterceptor1 implements HandlerInterceptor {
/*进入Handler方法之前执行
多用于登陆校验、权限拦截;返回ture,放行
如:身份认证:如果 认证不通过则表明当前用户没有登陆,需要此方法拦截不再向下执行*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("HandleInterceptor1 …… …… preHandle1");
return true;
}
/*进入 Handler方法之后,返回 modelAndView 之前执行
这里可在返回用户前对 模型数据进行加工处理,如将公用的模型数据(如菜单导航)传到页面*/
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
Object o, ModelAndView modelAndView) throws Exception {
System.out.println("HandleInterceptor1 …… …… postHandle1");
}
/*完成后执行本方法
这里可得到执行 handler 的异常信息
可记录操作日志,资源清理等*/
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
Object o, Exception e) throws Exception {
System.out.println("HandleInterceptor1 …… …… afterCompletion1");
}
}
拦截器2 也类似;
拦截器配置
springMVC.xml:
<!--多个拦截器顺序执行-->
<mvc:interceptors>
<mvc:interceptor>
<!-- "/**": 表示所有url 包括子url路径 -->
<mvc:mapping path="/**"/>
<bean class="lxf.interceptor.HandleInterceptor1"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="lxf.interceptor.HandleInterceptor2"/>
</mvc:interceptor>
</mvc:interceptors>
拦截测试
测试多个拦截器 三个方法的执行时机。
1. 拦截器 1,2 的 preHandle 都为 true:
即
拦截器1 的 preHandle() 返回值为 true;
拦截器2 的 preHandle() 返回值为 true;
运行结果:
小结:
preHandle 方法按顺序执行,
postHandle 和 afterCompletion 按拦截器配置的逆向顺序执行。
2. 拦截器 1 的 preHandle 为 true,2 的为 false:
即
拦截器1 的 preHandle() 返回值为 true;
拦截器2 的 preHandle() 返回值为 false;
运行结果:
小结:
拦截器1放行,拦截器2 preHandle才会执行。
拦截器2 preHandle 不放行,拦截器2 postHandle 和 afterCompletion 不会执行。
只要有一个拦截器不放行,postHandle 不会执行。
3. 拦截器 1 ,2 的 preHandle 都为 false:
即
拦截器1 的 preHandle() 返回值为 false;
拦截器2 的 preHandle() 返回值为 false;
运行结果:
小结:
拦截器1 preHandle 不放行,postHandle 和 afterCompletion 不会执行。
拦截器1 preHandle 不放行,拦截器2 不执行。
总结:
根据测试结果,对拦截器应用:
- 统一日志处理拦截器,需要该拦截器 preHandle 一定要放行,且将它放在拦截器链接中第一个位置;
- 登陆认证拦截器,放在拦截器链接中第一个位置;
- 权限校验拦截器,放在登陆认证拦截器之后。(因为登陆通过后才校验权限)
————————————————————————————————————————————————————————