1.拦截器
拦截器和过滤器类似,过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。
2.拦截器测试
在使用拦截器之前首先在springmvc.xml加入拦截器配置
<!--拦截器配置-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 映射请求路径 -->
<mvc:mapping path="/target"/>
<!-- 自定义拦截器类 -->
<bean class="com.lepeng.web.intercepter.MyIntercepter"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器类:
/**
* 拦截器
*/
public class MyIntercepter1 implements HandlerInterceptor {
/**
* 此方法在目标方法执行之前执行。
* @param request
* @param response
* @param handler 被拦截的目标方法对象
* @return true 放行 false 不放行
* @throws Exception
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return true; //放行
}
/**
* 此方法在目标方法执行之后执行
* @param request
* @param response
* @param handler 被拦截的目标方法对象
* @param modelAndView 结果视图
* @throws Exception
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
/**
* 在服务器响应数据之前
* @param request
* @param response
* @param handler 被拦截的目标方法对象
* @param ex 出异常后的信息
* @throws Exception
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}
测试:
@Controller
public class TargetController {
@RequestMapping("/target")
public void target(){
System.out.println("目标方法执行了....");
}
}
结果:
分析:
方法名 | preHandler | postHandler | afterCompletion |
---|---|---|---|
调用时间 | Controller方法处理之前 | Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作 | DispatcherServlet进行视图的渲染之后 |
执行顺序 | 链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执 | 链式Intercepter情况下,Intercepter按照声明的顺序倒着执行 | |
注意事项 | 若返回false,则中断执行,不会进入afterCompletion postHandler | 调用前提:preHandle返回true | 多用于清理资源 |
3.拦截器链
拦截器链中perHandler方法时按照加载顺序进行执行,
由于postHandler是在执行完Controller方法之后,DispatcherServlet进行视图的渲染之前执行,所以他是按照逆序执行