1.定义
定义拦截器,实现HandlerInterceptor接口,接口中实现三个方法.
2.拦截器配置
-
针对HandlerMapping进行的拦截器设置:
springmvc的拦截器是针对HandlerMapping进行拦截设置.如果在某个HandlerMapping中配置拦截器,经过该HandlerMapping映射成功的handler最终才使用该拦截器.
麻烦,不推荐使用.
-
针对全局的拦截器:
springmvc配置类似全局的拦截器,springmvc的框架会将配置的类似全局的拦截器注入到每个HandlerMapping中,
<!--全局拦截器-->
<mvc:interceptors>
<!--多个拦截器顺序执行-->
<mvc:interceptor>
<!--/**表示拦截所有的url包括子url-->
<mvc:mapping path="/**"/>
<bean class="cn.myjava.ssm.interceptor.HandlerInterceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors>
3.测试总结,(假定有两个拦截器,且A在B前面)
* 两个拦截器都放行:
preHandle方法按顺序执行.
postHandle和afterCompletion逆向执行.
* 拦截器A放行,B不放行:
拦截器A放行,拦截器B的preHandle才会执行.
拦截器B的preHandle不放行,拦截器B的postHandle和afterCompletion不会执行.
只要有一个拦截器拦截不放行,postHandler不会执行.
*两个拦截器都不放行
只有A的preHandle方法执行,其他都不执行.
总结:
比如写一个日志的处理拦截器,需要该拦截器preHandle一定要放行,且将它放在拦截器链中第一个位置.
登录认证拦截器,放在拦截器链接中的第一位置,仅次于日志.
权限校验,放在登录认证之后.
4.三个拦截器方法的总结:
* preHandel
进入Handler方法之前执行.
用于身份认证,身份授权等...
* postHandle
进入Handler方法之后,返回modelAndView之前执行
应用场景从modelAndView出发,放一些通用的各种模型和数据和视图啥的.
* afterHandle
执行Handler完成执行此方法
统一的异常处理,统一的日志处理,