Spring filter和拦截器的区别和执行顺序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring filter和拦截器的区别和执行顺序相关的知识,希望对你有一定的参考价值。
一、定义
拦截器 :是在面向切面编程的就是在service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。
过滤器:是在javaweb中,传入的request、response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者 struts的action前统一设置字符集,或者去除掉一些非法字符.。
二、xml文件配置
1.filter
该过滤器的方法是创建一个类XXXFilter实现此接口,并在该类中的doFilter方法中声明过滤规则,然后在配置文件web.xml中声明他所过滤的路径
2.Interceptor
也要实现HandlerInterceptor 接口,这里只介绍方法注解配置
三、具体区别
总结:两者的本质区别:拦截器是基于Java的反射机制的,而过滤器是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。
参考技术A 区别主要以下几点:1.spring的拦截器与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:
2.使用范围不同:Filter是Servlet规范规定的,只能用于Web程序中。而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。
3.规范不同:Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。
4.深度不同:Filter在只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用拦截器。
顺序就是Spring filter先执行的。 参考技术B UserLoginFilter.java 和 ApiLog.java 这两个文件里面分别是“用户登录检查过滤器”和“接口日志过滤器”,因为这两个文件的 首字母A排U之前 ,导致每次执行的时候都是先执行“接口日志过滤器”再执行“用户登录检查过滤器”,所以我们现在修改两个文件的名称分别为
Filter0_UserLogin.java
Filter1_ApiLog.java
这样就能先执行“用户登录检查过滤器”再执行“接口日志过滤器” 参考技术C Filter的执行顺序跟你配置的执行顺序是一样的,执行的话要触发到才会执行啊
当然要是过滤/*就跟配置顺序一样了 参考技术D 就是减少乱码的可能性,那是必须的。过滤器也可以减少重复的代码。也可以增加安全性。想详细解答加 851945412其实你的问题问得范围有点大。有些是可以得。有些是不行滴。。。
SpringBoot使用过滤器拦截器切面及其之间的区别和执行顺序
点击关注公众号,实用技术文章及时了解
先上代码,下面的demo中包含多个拦截器、过滤器,以及切面的前置通知/后置通知/环绕通知:
https://gitee.com/xiaorenwu_dashije/filter_interceptor
相关原理:
首先了解一下SpringMVC的执行流程
具体流程如下:
用户发起请求到前端控制器(Controller)
前端控制器没有处理业务逻辑的能力,需要找到具体的模型对象处理(Handler),到处理器映射器(HandlerMapping)中查找Handler对象(Model)。
HandlerMapping返回执行链,包含了2部分内容:① Handler对象、② 拦截器数组
前端处理器通过处理器适配器包装后执行Handler对象。
处理业务逻辑。
Handler处理完业务逻辑,返回ModelAndView对象,其中view是视图名称,不是真正的视图对象。
将ModelAndView返回给前端控制器。
视图解析器(ViewResolver)返回真正的视图对象(View)。
(此时前端控制器中既有视图又有Model对象数据)前端控制器根据模型数据和视图对象,进行视图渲染。
返回渲染后的视图(html/json/xml)返回。
给用户产生响应。
核心就是DispatcherServlet核心控制器,我们看源码可知道DispatcherServlet是Servlet的子类
下面用一张图说一下过滤器、Servlet容器、拦截器、AOP、Controller之间的关系
然后具体执行流程如下:
拦截器和过滤器的区别
1、拦截器不依赖与servlet容器是SpringMVC自带的,过滤器依赖于Servlet容器。
2、拦截器是基于java的反射机制的,而过滤器是基于函数回调。
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
4、拦截器可以访问controller上下文、值栈里的对象,而过滤器不能访问。
拦截器的preHandle方法在进入controller前执行,而拦截器的postHandle方法在执行完controller业务流程后,在视图解析器解析ModelAndView之前执行,可以操控Controller的ModelAndView内容。而afterCompletion是在视图解析器解析渲染ModelAndView完成之后执行的
过滤器是在服务器启动时就会创建的,只会创建一个实例,常驻内存,也就是说服务器一启动就会执行Filter的init(FilterConfig config)方法.当Filter被移除或服务器正常关闭时,会执行destroy方法
5、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
关于这句话的解读是:我们知道拦截器是SprinMVC自带的,而SpringMVC存在Controller层的,而controller层可以访问到service层,service层是不能访问service层的,而过滤器是客户端和服务端之间请求与响应的过滤
6、过滤器和拦截器触发时机、时间、地方不一样
过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是在servlet处理完后,返回给前端之前,如果看不懂可以看7完后再来理解
7、过滤器包裹住servlet,servlet包裹住拦截器。
来源:cnblogs.com/java-spring/p/12742984.html
推荐
PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!
以上是关于Spring filter和拦截器的区别和执行顺序的主要内容,如果未能解决你的问题,请参考以下文章
拦截器(Interceptor)和过滤器(Filter)的区别和执行顺序)
拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别
拦截器(Interceptor)和过滤器(Filter)的执行顺序和区别