一、拦截器的配置
- SpringMVC中的拦截器用于拦截控制器方法的执行
- SpringMVC中的拦截器需要实现HandlerInterceptor
/**
* 1. 拦截器 实现HandlerInterceptor接口
* ctrl+o 实现方法重写
* 2. 配置拦截器
*/
@Component
public class FirstInterceptor implements HandlerInterceptor {
}
- SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置:
<!--配置拦截器-->
<mvc:interceptors>
<ref bean="firstInterceptor"></ref>
<ref bean="secondInterceptor"></ref>
<!--对当前所有请求进行拦截-->
<!--<bean class="com.znb.mvc.interceptors.FirstInterceptor"></bean>-->
<!--<ref bean="firstInterceptor"></ref>-->
<!--可以设置当前的拦截路径-->
<!-- <mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/"/>
<ref bean="firstInterceptor"></ref>
</mvc:interceptor>-->
</mvc:interceptors>
二、拦截器的三个抽象方法
- preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("FirstInterceptor pre");
return HandlerInterceptor.super.preHandle(request, response, handler);
}
- postHandle:控制器方法执行之后执行postHandle()
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
System.out.println("FirstInterceptor post");
}
- afterComplation:处理完视图和模型数据,渲染视图完毕之后执行afterComplation()
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
System.out.println("FirstInterceptor after");
}
三、多个拦截器的执行顺序
设置两个拦截器
- FirstInterceptor
@Component
public class FirstInterceptor implements HandlerInterceptor {
/**
* 在控制器方法之前执行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("FirstInterceptor pre");
return HandlerInterceptor.super.preHandle(request, response, handler);
}
/**
* 在控制器方法之后执行
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
System.out.println("FirstInterceptor post");
}
/**
* 在视图渲染之后执行
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
System.out.println("FirstInterceptor after");
}
}
- SecondInterceptor
@Component
public class SecondInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("SecondInterceptor pre");
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
System.out.println("SecondInterceptor post");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
System.out.println("SecondInterceptor after");
}
}
1. 若每个拦截器的preHandle()都返回true
- preHandle按照配置文件中的顺序执行。
- postHandle按照配置文件中的反序执行。
- afterCompletion按照配置文件中的反序执行。
2. 若某个拦截器的preHandle()返回了false
-
第二个拦截器的preHandle()方法返回了false
-
总结,某个拦截器的preHandle()返回了false
该拦截器之前的所有preHandle()方法都执行,该拦截器的方法也会执行。 所有拦截器的postHandle()方法都不执行 该拦截器之前的afterCompletion()方法,逆序执行
-
preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false的拦截器之前的拦截器的afterComplation()会执行。