SpringMVC拦截器

SpringMVC拦截器

什么是SpringMvc拦截器

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

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

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

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

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

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

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

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

* 作用目标不同

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

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

 

* 功能强度不同

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

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

* 结论

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

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

*拦截器工作流程图*

 

SpringMvc拦截器的使用

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

包名建议叫interceptor

创建拦截器类DemoInterceptor

```java
@Component
public class DemoInterceptor implements HandlerInterceptor {

    // 控制器运行指定方法前,运行的方法
    // 返回值是boolean类型,返回true允许访问目标控制器,返回false表示拒绝访问目标控制器
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle运行");
        // 允许运行控制器方法
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle运行");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion运行");
    }
}
```

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

需要在spring配置类中编写

在config包中创建InterceptorConfig类

```java
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    // 将拦截器对象从Spring容器中获取出来
    @Autowired
    private DemoInterceptor demoInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 配置哪个拦截器对象拦截哪个路径
        registry.addInterceptor(demoInterceptor)
                // 设置拦截路径,支持统配,例如 /base/cart/*
                .addPathPatterns("/base/cart/add");
    }
}
```

重启cart模块

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

并关注它们的顺序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值