拦截器
Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
预处理:在访问controller之前执行的代码
后处理:在访问controller返回之后执行的代码
拦截器链(Interceptor Chain):拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。
可以自定义实现拦截器,需要实现HandlerInterceptor 接口
拦截器和过滤器的区别:
- 过滤器是 servlet 规范中的一部分, 任何 java web 工程都可以使用。
- 拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
- 过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。
- 拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image或者 js 是不会进行拦
截的
自定义拦截器
在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-执行
热门文章
- 搭建vue3.0+Element Plus项目
- 「3月6日」最高速度21.1M/S,2025年Clash/Shadowrocket/SSR/V2ray每天更新免费节点订阅地址分享
- 「4月15日」最高速度18.5M/S,2025年Clash/SSR/V2ray/Shadowrocket每天更新免费节点订阅地址分享
- 「3月19日」最高速度22.8M/S,2025年Clash/Shadowrocket/V2ray/SSR每天更新免费节点订阅地址分享
- 深圳市宠物领养之家官网电话 深圳市宠物领养之家官网电话号码
- 「3月2日」最高速度19.9M/S,2025年SSR/Clash/Shadowrocket/V2ray每天更新免费节点订阅地址分享
- 面试官:@Transactional 注解是如何实现的?面试必问!
- 《燕赵刑警》(硬核推荐)燕赵刑警第三集视频,女超人第三季,真凶难逃,
- 「3月10日」最高速度19.1M/S,2025年Clash/Shadowrocket/SSR/V2ray每天更新免费节点订阅地址分享
- MySQL 索引简介