Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
预处理:在访问controller之前执行的代码
后处理:在访问controller返回之后执行的代码
拦截器链(Interceptor Chain):拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
可以自定义实现拦截器,需要实现HandlerInterceptor 接口
拦截器和过滤器的区别:
在resources/springmvc.xml文件中配置拦截器:
<!--配置拦截器--><mvc:interceptors><!--配置拦截器--><mvc:interceptor><!--要拦截的具体的方法,当请求路径前缀是/user时拦截--><mvc:mapping path="/user/*"/><!--不要拦截的方法<mvc:exclude-mapping path=""/>--><!--配置拦截器对象--><beanclass="包名.MyInterceptor1"/></mvc:interceptor><!--配置第二个拦截器--><mvc:interceptor><!--要拦截的具体的方法,所有的请求都拦截--><mvc:mapping path="/**"/><!--不要拦截的方法<mvc:exclude-mapping path=""/>--><!--配置拦截器对象--><beanclass="包名.MyInterceptor2"/></mvc:interceptor></mvc:interceptors>
第一个拦截器:
publicclassMyInterceptor1implementsHandlerInterceptor{/** * 预处理,controller方法执行前 * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法 * return false不放行 * @param request * @param response * @param handler * @return * @throws Exception */publicbooleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception{ System.out.println("MyInterceptor1-preHandle-执行");returntrue;}/** * 后处理方法,controller方法执行后,success.jsp执行之前 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */publicvoidpostHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception{ System.out.println("MyInterceptor1-postHandle-执行");}/** * success.jsp页面执行后,该方法会执行 * @param request * @param response * @param handler * @param ex * @throws Exception */publicvoidafterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception{ System.out.println("MyInterceptor1-afterCompletion-执行");}}
publicclassMyInterceptor2implementsHandlerInterceptor{/** * 预处理,controller方法执行前 * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法 * return false不放行 * @param request * @param response * @param handler * @return * @throws Exception */publicbooleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception{ System.out.println("MyInterceptor2-preHandle-执行");returntrue;}/** * 后处理方法,controller方法执行后,success.jsp执行之前 * @param request * @param response * @param handler * @param modelAndView * @throws Exception */publicvoidpostHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception{ System.out.println("MyInterceptor2-postHandle-执行");}/** * success.jsp页面执行后,该方法会执行 * @param request * @param response * @param handler * @param ex * @throws Exception */publicvoidafterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception{ System.out.println("MyInterceptor2-afterCompletion-执行");}}
UserController :
@Controller@RequestMapping("/user")publicclassUserController{@RequestMapping("/testInterceptor")public StringtestInterceptor(){ System.out.println("UserController.testInterceptor控制器-执行");//success.jsp页面return"success";}}
success.jsp:
<% System.out.println("success.jsp-执行");%>
当请求/user/testInterceptor时,控制台打印结果:
MyInterceptor1-preHandle-执行
MyInterceptor2-preHandle-执行
UserController.testInterceptor控制器-执行
MyInterceptor2-postHandle-执行
MyInterceptor1-postHandle-执行
success.jsp-执行
MyInterceptor2-afterCompletion-执行
MyInterceptor1-afterCompletion-执行