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