SpringMVC拦截器

小灰灰 2022-02-01 15:36 556阅读 0赞

目录

定义拦截器

测试

拦截器应用


定义拦截器

  1. public class HandlerInterceptor1 implements HandlerInterceptor {
  2. //在执行handler之前来执行的
  3. //用于用户认证校验、用户权限校验
  4. @Override
  5. public boolean preHandle(HttpServletRequest request,
  6. HttpServletResponse response, Object handler) throws Exception {
  7. System.out.println("HandlerInterceptor1...preHandle");
  8. //如果返回false表示拦截不继续执行handler,如果返回true表示放行
  9. return true;
  10. }
  11. //在执行handler返回modelAndView之前来执行
  12. //如果需要向页面提供一些公用 的数据或配置一些视图信息,使用此方法实现 从modelAndView入手
  13. @Override
  14. public void postHandle(HttpServletRequest request,
  15. HttpServletResponse response, Object handler,
  16. ModelAndView modelAndView) throws Exception {
  17. System.out.println("HandlerInterceptor1...postHandle");
  18. }
  19. //执行handler之后执行此方法
  20. //作系统 统一异常处理,进行方法执行性能监控,在preHandle中设置一个时间点,在afterCompletion设置一个时间,两个时间点的差就是执行时长
  21. //实现 系统 统一日志记录
  22. @Override
  23. public void afterCompletion(HttpServletRequest request,
  24. HttpServletResponse response, Object handler, Exception ex)
  25. throws Exception {
  26. System.out.println("HandlerInterceptor1...afterCompletion");
  27. }
  28. }
  29. public class HandlerInterceptor2 implements HandlerInterceptor {
  30. //在执行handler之前来执行的
  31. //用于用户认证校验、用户权限校验
  32. @Override
  33. public boolean preHandle(HttpServletRequest request,
  34. HttpServletResponse response, Object handler) throws Exception {
  35. System.out.println("HandlerInterceptor2...preHandle");
  36. //如果返回false表示拦截不继续执行handler,如果返回true表示放行
  37. return true;
  38. }
  39. //在执行handler返回modelAndView之前来执行
  40. //如果需要向页面提供一些公用 的数据或配置一些视图信息,使用此方法实现 从modelAndView入手
  41. @Override
  42. public void postHandle(HttpServletRequest request,
  43. HttpServletResponse response, Object handler,
  44. ModelAndView modelAndView) throws Exception {
  45. System.out.println("HandlerInterceptor2...postHandle");
  46. }
  47. //执行handler之后执行此方法
  48. //作系统 统一异常处理,进行方法执行性能监控,在preHandle中设置一个时间点,在afterCompletion设置一个时间,两个时间点的差就是执行时长
  49. //实现 系统 统一日志记录
  50. @Override
  51. public void afterCompletion(HttpServletRequest request,
  52. HttpServletResponse response, Object handler, Exception ex)
  53. throws Exception {
  54. System.out.println("HandlerInterceptor2...afterCompletion");
  55. }
  56. }

拦截器要实现HandlerInterceptor接口,或者继承已经实现了HandlerInterceptor接口的抽象类

  • preHandle在执行Controller的方法之前调用。可以有多个拦截器,每个拦截器的调用会依据它的声明顺序依次执行。如果该方法的返回值为false,后续的拦截器和Controller都不会再执行,为true,则可以继续执行。
  • postHandle:在Controller方法调用之后,DispatcherServlet 进行视图返回渲染之前(返回modelandview)被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。
  • afterCompletion:在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。

在springmvc.xml中配置

  1. <!--拦截器 -->
  2. <mvc:interceptors>
  3. <!--多个拦截器,顺序执行 -->
  4. <mvc:interceptor>
  5. <!-- /**可以拦截所有路径不管多少层 -->
  6. <mvc:mapping path="/**" />
  7. <bean class="cn.itcast.springmvc.interceptor.HandlerInterceptor1"></bean>
  8. </mvc:interceptor>
  9. <mvc:interceptor>
  10. <mvc:mapping path="/**" />
  11. <bean class="cn.itcast.springmvc.interceptor.HandlerInterceptor2"></bean>
  12. </mvc:interceptor>
  13. </mvc:interceptors>

测试

在浏览器中随意输入一个方法

当两个浏览器返回都为true时,打印结果为

  1. HandlerInterceptor1...preHandle
  2. HandlerInterceptor2...preHandle
  3. HandlerInterceptor2...postHandle
  4. HandlerInterceptor1...postHandle
  5. HandlerInterceptor2...afterCompletion
  6. HandlerInterceptor1...afterCompletion

当都为false时

  1. HandlerInterceptor1...preHandle

当第一个拦截器为true,第二个拦截器为false时

  1. HandlerInterceptor1...preHandle
  2. HandlerInterceptor2...preHandle
  3. HandlerInterceptor1...afterCompletion

总结:

拦截器1放行,拦截器2 preHandle才会执行。

拦截器2 preHandle不放行,拦截器2 postHandle和afterCompletion不会执行。

只要有一个拦截器不放行,postHandle不会执行。

比如:统一日志处理拦截器,需要该拦截器preHandle一定要放行,且将它放在拦截器链接中第一个位置。

比如:登录认证拦截器,放在拦截器链接中第一个位置。权限校验拦截器,放在登录认证拦截器之后(因为登录通过后才校验权限)

拦截器应用

发表评论

表情:
评论列表 (有 0 条评论,556人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringMVC:拦截

    简介: 拦截器本身并不重要,但在源码中很重要。 拦截器用于拦截请求,用于在处理器执行前进行预处理或者处理执行完进行尾处理。 其作用类似于过滤器,不同的是过滤器是ser

    相关 springmvc拦截

    1. springmvc拦截器使用和原理理解 1.1 作用 与struts2类似,springmvc的拦截器主要作用也是在服务端真正处理请求前后进行一些相关的操作