ToB企服应用市场:ToB评测及商务社交产业平台

标题: 12、SpringMVC之拦截器 [打印本页]

作者: tsx81428    时间: 2023-12-14 05:00
标题: 12、SpringMVC之拦截器
12.1、环境搭建

创建名为spring_mvc_interceptor的新module,过程参考9.1节和9.5节
12.1.1、页面请求示例

  1. <a th:target="_blank" href="https://www.cnblogs.com/@{/test/hello}">测试拦截器</a>
复制代码
12.1.2、控制器方法示例

  1.     @RequestMapping("/test/hello")
  2.     public String testHello(){
  3.         return "success";
  4.     }
复制代码
12.2、拦截器的入门示例

12.2.1、创建拦截器

  1. package online.liaojy.interceptor;
  2. import org.springframework.web.servlet.HandlerInterceptor;
  3. import org.springframework.web.servlet.ModelAndView;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. /**
  7. * @author liaojy
  8. * @date 2023/11/7 - 20:57
  9. */
  10. // SpringMVC 中的拦截器要实现 HandlerInterceptor 接口
  11. public class AAAInterceptor implements HandlerInterceptor {
  12.     // preHandle()方法在控制器方法执行之前执行
  13.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  14.         System.out.println("AAAInterceptor-->preHandle()");
  15.         // 返回true表示不拦截,即执行控制器方法
  16.         // 返回false表示拦截,即不再执行控制器方法
  17.         return true;
  18.     }
  19.     // postHandle()方法在控制器方法执行之后执行
  20.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  21.         System.out.println("AAAInterceptor-->postHandle()");
  22.     }
  23.     // afterCompletion()方法在渲染完视图之后执行
  24.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  25.         System.out.println("AAAInterceptor-->afterCompletion()");
  26.     }
  27. }
复制代码
12.2.2、配置拦截器

与自定义的过滤器一样,自定义的拦截器也要配置后才能生效;
过滤器是服务器中的组件,所以配置到 web.xml 中;
拦截器是 springmvc 中的组件,因此要配置到 springmvc 的配置文件中。
  1.     <mvc:interceptors>
  2.         <bean ></bean>
  3.     </mvc:interceptors>
复制代码
12.2.3、测试效果



因为在配置拦截器时,没有指定要拦截的路径,所以访问任何DispatcherServlet处理的资源时,拦截器都会执行。



12.3、拦截器的注解配置

除了使用 bean 标签通过全限定类名来配置拦截器,还可以通过 ref 标签引用已存在的 bean 组件来配置拦截器
12.3.1、将拦截器标识为bean组件


因为拦截器不属于持久层、业务层和控制层,所以应该用 @Component 注解将其标识为一个 bean 组件
  1. @Component
复制代码
12.3.2、通过ref标签引用配置拦截器

  1.     <mvc:interceptors>
  2.         <bean ></bean>
  3.     </mvc:interceptors>
复制代码
12.4、拦截器的进阶示例

通过上述的方式来配置拦截器,会对 DispatcherServlet 所处理的所有请求都进行拦截;
在实际情况中,可能只需要拦截部分请求,或排除部分请求的拦截。
12.4.1、精确的拦截配置

  1.     <mvc:interceptors>
  2.         <bean ></bean>
  3.     </mvc:interceptors>    <mvc:interceptors>
  4.         <bean ></bean>
  5.     </mvc:interceptors>    <mvc:interceptors>
  6.         <bean ></bean>
  7.     </mvc:interceptors>    <mvc:interceptors>
  8.         <bean ></bean>
  9.     </mvc:interceptors>    <mvc:interceptors>
  10.         <bean ></bean>
  11.     </mvc:interceptors>    <mvc:interceptors>
  12.         <bean ></bean>
  13.     </mvc:interceptors>
复制代码
12.4.2、测试效果



如上图所示,拦截了一级路径的请求



如上图所示,拦截了二级路径的请求


如上图所示,没有拦截/abc的请求
注意:为实现演示效果,本例已在springmvc配置文件中设置了关于/abc请求的视图控制器
  1. [/code][size=5]12.5、多个拦截器的执行顺序[/size]
  2. [size=4]12.5.1、创建另一个拦截器[/size]
  3. [img]https://img2023.cnblogs.com/blog/2052479/202311/2052479-20231109093252051-1256129594.png[/img]
  4. [code]package online.liaojy.interceptor;
  5. import org.springframework.web.servlet.HandlerInterceptor;
  6. import org.springframework.web.servlet.ModelAndView;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. /**
  10. * @author liaojy
  11. * @date 2023/11/9 - 7:27
  12. */
  13. public class BBBInterceptor implements HandlerInterceptor {
  14.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  15.         System.out.println("BBBInterceptor-->preHandle()");
  16.         return true;
  17.     }
  18.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  19.         System.out.println("BBBInterceptor-->postHandle()");
  20.     }
  21.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  22.         System.out.println("BBBInterceptor-->afterCompletion()");
  23.     }
  24. }
复制代码
12.5.2、配置多个拦截器

  1.     <mvc:interceptors>
  2.         <bean ></bean>
  3.     </mvc:interceptors>        
复制代码
12.5.3、情况一



注意:此时 AAAInterceptor 和 BBBInterceptor 拦截器的 preHandle() 方法返回值都是 true
12.5.4、情况二



注意:此时 AAAInterceptor 拦截器的 preHandle() 方法返回值为true,而 BBBInterceptor 拦截器的为 false
12.5.5、执行顺序流程图


12.6、相关拓展

12.6.1、拦截器与过滤器的区别

12.6.2、拦截器的应用场景


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4