1、过滤器,拦截器,切片可以取到数据的差别
过滤器:可以拿到原始的HTTP请求和响应信息,拿不到处理请求的方法值信息。
拦截器:可以拿到HTTP请求和响应信息,可以获取到拦截的类名称、方法名称,不能获取到方法参数,原因是在dispatcherservlet源码中,经过preHandle才对方法参数通过request里面开始处理拼接)。
切片:可以拿到请求方法的传入参数值,拿不到原始的HTTP请求和响应的对象。
2、过滤器filter和拦截器Interceptor的区别
spring的拦截器和servlet的过滤器有相似之处,都是AOP思想的体现,都可以实现权限检查,日志记录,不同的是
适用范围不同:Filter是Servlet容器规定的,只能使用在servlet容器中,而拦截器的使用范围就大得多。
使用的资源不同:拦截器是属于spring的一个组件,因此可以使用spring的所有资源,对象,如service对象,数据源,事务控制等,而过滤器就不行。
深度不同:Filter还在servlet前后起作用。而拦截器能够深入到方法前后,异常抛出前后,因此拦截器具有更大的弹性,所有在spring框架中应该优先使用拦截器。
通过调试可以发现,拦截器的执行过程是在过滤器的doFilter中执行的,过滤器的初始化会在项目启动时执行。
过滤器1开始初始化
过滤器2开始初始化
过滤器1开始工作:http://127.0.0.1:17093/testFilter
过滤器2开始工作:http://127.0.0.1:17093/testFilter
拦截器1 preHandle: 请求的uri为:http://127.0.0.1:17093/testFilter
拦截器2 preHandle: 请求的uri为:http://127.0.0.1:17093/testFilter
aop1开始:
aop1拦截方法参数arg is:abc
aop1拦截方法参数arg is:123
aop2开始:
aop2拦截方法参数arg is:abc
aop2拦截方法参数arg is:123
控制器testFilter开始工作:str='abc',integer=123
aop2结束:
aop1结束:
拦截器2 postHandle:
拦截器1 postHandle:
拦截器2 afterCompletion:
拦截器1 afterCompletion:
过滤器2结束工作:
过滤器1结束工作:
这里通过一张图来说明过滤器和拦截器执行顺序
若三者共存的情况下执行顺序
正常运行顺序为:filter-interceptor-controllerAdvice-aspect-controller
异常情况下:controller-aspect-controllerAdvice-interceptor-filter
过滤器、Servlet容器、拦截器、AOP、Controller之间的关系