SpringMvc拦截器是SpringMvc框架提供的功能
它可以在控制器方法运行之前或运行之后(还有其它特殊时机)对请求进行处理或加工的特定接口
这个拦截器的编写是典型的A(Aspect)OP思想的体现
在我们现有的控制器方法运行前后进行代码的维护和切面的通知
> 常见面试题:过滤器和拦截器的区别
过滤器和拦截器都可以在控制器方法运行前后加入额外代码,实现aop效果
它们的区别主要体现在如下几方面
* 提供者不同
- 过滤器是由javaEE提供的
- 拦截器是SpringMvc提供的
* 作用目标不同
- 过滤器作用目标更广:可以作用在所有请求当前服务器资源的流程中
- 拦截器作用目标单一:只能作用在请求目标为当前服务器控制器的流程中

* 功能强度不同
- 过滤器是原生的JavaEE的功能,功能较弱,不能直接处理Spring容器中的内容和对象
- 拦截器是SpringMvc框架提供的,所以天生和Spring容器有更好的兼容性,可以直接操作Spring容器中的对象,而且拦截器相比于过滤器有更完善的参数返回值的处理,也有更多的运行时机
* 结论
如果请求的目标能确定是一个控制器方法,优先使用拦截器
如果请求的目标可能是其他静态资源,那么就需要使用过滤器
*拦截器工作流程图*

在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控制台输出的内容是否有拦截器中的消息
并关注它们的顺序