springMVC拦截器
拦截器的配置和使用
拦截器可以控制控制器方法的执行
首先我们要创建一个类继承HanlderInteceptor接口并实现其中的三个方法
@Component public class SecondInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("SecondInterceptor-->preHandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("SecondInterceptor-->postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("SecondInterceptor-->afterCompletion"); } }
配置xml文件
通过mvc:interceptors配置拦截器信息
<!-- 配置拦截器--> <mvc:interceptors> <!-- 使用bean注入自己的拦截器,作用于全部DispatcherServlet多处理的请求--> <!-- <bean id="firstInterceptor" class="interceptor.FirstInterceptor"/>--> <!-- 使用外部bean注入自己的拦截器,作用于全部DispatcherServlet多处理的请求--> <!-- <ref bean="firstInterceptor"/>--> <mvc:interceptor> <mvc:mapping path="/**"/> <ref bean="firstInterceptor"/> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/**"/> <ref bean="secondInterceptor"/> </mvc:interceptor> </mvc:interceptors>
可配置多个拦截器
拦截器中三个方法
proHandle:此方法作用于控制器方法执行之前,并返回一个布尔值。为真则继续执行控制器方法,否则就阻止控制器方法执行。
postHandle:此方法作用于控制器方法执行之后。
afterCompletion:此方法作用于视图渲染之后。
多个拦截器的执行顺序
拦截器的执行的顺序是根据xml配置文件中拦截器的配置顺序来决定的,proHandle方法的执行顺序按照拦截器的配置顺序顺序来执行,postHandle和afterCompletion按照拦截器的配置顺序逆序来执行。
如果在执行proHandle方法多个拦截器中某个拦截器返回了false,则这个拦截器之后的所有拦截器的不执行,且postHandle不会执行任何一个拦截器的方法,afterCompletion逆序执行false拦截器之前的全部方法