springmvc拦截器
1. 定义
-
定义拦截器,实现HandlerInterceptor接口,接口中提供三个方法
public class HandlerInterceptor1 implements HandlerInterceptor { //进入Handler方法之前执行 //应用场景:用于身份认证,身份授权 //比如省份认证,如果认证不通过表示当前用户没有登录,需要此方法拦截不再向下执行 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //return false表示拦截,不向下执行 //return true 表示放行 return false; } //进入Handler方法之后,返回ModelAndView之前 //应用场景:从ModelAndView触发,将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一制定视图 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } //执行Handler完成后执行 //应用场景:统一异常处理,统一日志处理 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
2. 拦截器配置
- 当配置多个拦截器时,只要有一个不放行就不会执行postHandle
2.1 springmvc拦截器针对HandlerMapping进行拦截配置
- 如果在某个HandlerMapping中配置拦截,经过该HandlerMapping映射成功的Handler最终使用该拦截器
- 代码(不常用):
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <property name="interceptor"> <list> <ref bean="handlerInterceptor1" /> <ref bean="handlerInterceptor2" /> </list> </property> </bean> <bean id="handlerInterceptor1" class="com.voion.ssm.HandlerInterceptor1" /> <bean id="handlerInterceptor2" class="com.voion.ssm.HandlerInterceptor2" />
2.2 类似全局的拦截器
- springmvc配置类似全局的拦截器,Springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中
<!-- 拦截器 --> <mvc:interceptors> <!-- 多个拦截器,顺序执行 --> <mvc:interceptor> <!-- /**表示所有url包括url子路径 --> <mvc:mapping path="/**"/> <bean class="com.voion.ssm.interceptor.HandlerInterceptor1"></bean> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.voion.ssm.interceptor.HandlerInterceptor2"></bean> </mvc:interceptor> </mvc:interceptors>
3. 拦截器的应用
- 例1:统一日志处理拦截器,需要该拦截器preHandle一定要放行,且将它放在拦截器连接中第一个位置
- 例2:登录认证拦截器,放在拦截器连接中第一个位置,权限校验拦截器放在登录认证拦截器之后(因为登录通过后才校验权限)
3.1 实现登录认证
- 用户请求url
- 拦截器拦截校验
- 如果请求的url是公开地址,无需登录即可访问的url,让放行
- 用户session不存在,跳转登录页面
- 如果用户session存在放行,继续操作
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">