定义拦截器: 实现HandlerInterceptor接口。接口中提供三个方法。 1、进入Handler方法之前执行 //可以用于身份认证、身份授权,return false表示拦截;return true表示放行。 public boolean preHandler(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{} 2、进入Handler方法之后,返回ModelAndView之前执行 //应用场景:将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一视图 public void postHandler(HttpServletRequest request, HttpServletResponse response, ModelAndView modelAndView) throws Exception{} 3、Handler方法执行完成后执行此方法 //应用场景:统一异常处理,统一日志处理。 public void afterCompletion(HttpServletRequest request, HttpServletResponse response,Exception ex)throws Exception{}
拦截器配置: 1、springmvc拦截器针对HandlerMapping进行拦截设置。 如果在某个HandlerMapping中配置拦截,经过该HandlerMapping映射成功的Handler最终才使用该拦截器。 不推荐使用,比较麻烦。
2、springmvc配置类似全局的拦截器,springmvc框架将配置的类似全局的拦截器注入到每一个HandlerMapping中。 <!--拦截器--> <mvc:interceptors> <!--多个拦截器顺序执行--> <mvc:interceptor> <!--/**表示所有url包括子url路径--> <mvc:mapping path="/**"/> <bean class="拦截器1的全限定名"></bean> </mvc:interceptor> <mvc:interceptor> <!--/*表示匹配根目录下的所有url不包括子url路径--> <mvc:mapping path="/*"/> <bean class="拦截器2的全限定名"></bean> </mvc:interceptor> </mvc:interceptors>
注意: 拦截器1放行,拦截器2的preHandle才会执行; 拦截器2 preHandle不放行,拦截器2 的postHandle和afterCompletion不会执行; 只要有一个拦截器不放行,postHandle不会执行。 比如登录认证拦截器放在拦截器链接中的第一个位置,权限校验拦截器放在之后。因为登录通过后才校验权限。