• SpringMVC拦截器


    SpringMVC拦截器

    什么是SpringMvc拦截器

    SpringMvc拦截器是SpringMvc框架提供的功能

    它可以在控制器方法运行之前或运行之后(还有其它特殊时机)对请求进行处理或加工的特定接口

    这个拦截器的编写是典型的A(Aspect)OP思想的体现

    在我们现有的控制器方法运行前后进行代码的维护和切面的通知

    > 常见面试题:过滤器和拦截器的区别

    过滤器和拦截器都可以在控制器方法运行前后加入额外代码,实现aop效果

    它们的区别主要体现在如下几方面

    * 提供者不同
      - 过滤器是由javaEE提供的
      - 拦截器是SpringMvc提供的

    * 作用目标不同

      - 过滤器作用目标更广:可以作用在所有请求当前服务器资源的流程中

      - 拦截器作用目标单一:只能作用在请求目标为当前服务器控制器的流程中

     

    * 功能强度不同

      - 过滤器是原生的JavaEE的功能,功能较弱,不能直接处理Spring容器中的内容和对象

      - 拦截器是SpringMvc框架提供的,所以天生和Spring容器有更好的兼容性,可以直接操作Spring容器中的对象,而且拦截器相比于过滤器有更完善的参数返回值的处理,也有更多的运行时机

    * 结论

    ​     如果请求的目标能确定是一个控制器方法,优先使用拦截器

    ​     如果请求的目标可能是其他静态资源,那么就需要使用过滤器

    *拦截器工作流程图*

     

    SpringMvc拦截器的使用

    在cart-webapi模块中创建一个包

    包名建议叫interceptor

    创建拦截器类DemoInterceptor

    1. ```java
    2. @Component
    3. public class DemoInterceptor implements HandlerInterceptor {
    4.     // 控制器运行指定方法前,运行的方法
    5.     // 返回值是boolean类型,返回true允许访问目标控制器,返回false表示拒绝访问目标控制器
    6.     @Override
    7.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    8.         System.out.println("preHandle运行");
    9.         // 允许运行控制器方法
    10.         return true;
    11.     }
    12.     @Override
    13.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    14.         System.out.println("postHandle运行");
    15.     }
    16.     @Override
    17.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    18.         System.out.println("afterCompletion运行");
    19.     }
    20. }
    21. ```

    然后要配置拦截器的拦截目标

    需要在spring配置类中编写

    在config包中创建InterceptorConfig类

    1. ```java
    2. @Configuration
    3. public class InterceptorConfig implements WebMvcConfigurer {
    4.     // 将拦截器对象从Spring容器中获取出来
    5.     @Autowired
    6.     private DemoInterceptor demoInterceptor;
    7.     @Override
    8.     public void addInterceptors(InterceptorRegistry registry) {
    9.         // 配置哪个拦截器对象拦截哪个路径
    10.         registry.addInterceptor(demoInterceptor)
    11.                 // 设置拦截路径,支持统配,例如 /base/cart/*
    12.                 .addPathPatterns("/base/cart/add");
    13.     }
    14. }
    15. ```

    重启cart模块

    访问新增购物车商品的方法,检查cart控制台输出的内容是否有拦截器中的消息

    并关注它们的顺序

  • 相关阅读:
    深信服应用交付 AD 存在远程命令执行漏洞 附POC
    【牛客刷题-SQL】SQL2 查询多列
    Win10/Win11日历提醒与手机日历同步互联
    [附源码]java毕业设计闲置物品线上交易系统
    基于Java Swing和BouncyCastle的证书生成工具
    六、python Django REST framework数据处理[序列化]
    【头歌实验】一、Python初体验——Hello World
    Kafka Stream 学习笔记-2 使用Avro 协议
    前端学习笔记--React
    catkin_make文件更新经验
  • 原文地址:https://blog.csdn.net/weixin_68138130/article/details/126680095