1

关于过滤器与拦截器的区别

过滤器(Filter)和拦截器(Interceptor)都是可以作用于若干种不同的请求路径的组件,都可以对某种请求进行阻止,不允许继续向后执行,也可以选择放行,按照原本设定的处理流程继续执行!并且,在同一个项目中,允许同时存在若干个过滤器或拦截器,以形成过滤器链或拦截器链,如果某个请求涉及多个过滤器或拦截器,必须每个过滤器或拦截器都放行,才可以继续执行!

过滤器是Java EE中的组件,而拦截器是SpringMVC中的组件!只要是Java EE项目,都可以使用过滤器,但是,只有使用了SpringMVC框架,才可以使用拦截器,并且,仅当被SpringMVC框架处理的请求才可能被拦截器进行处理,例如使用SpringMVC框架时,将DispatcherServlet处理请求的路径设置为*.do,则只有以.do作为后缀的请求才可能被拦截器处理!

过滤器和拦截器的执行时间节点、执行的方法的数量都不相同,过滤器是在所有Servlet组件之前执行的!而拦截器的第1次执行是在DispatcherServlet之后,且在Controller组件之前执行的,而且,当拦截器选择“放行”时,在Controller执行之后,和执行最终的响应之前,还会各执行1次!

过滤器和拦截器的配置也不相同,过滤器是在web.xml中配置的,在配置过程中,可以配置若干个请求路径,也可以使用星号(*)作为通配符,但是,无法配置例外路径(白名单),而拦截器是在Spring的配置文件中进行配置的,其配置方式非常灵活,可以配置若干个请求路径,也可以使用通配符,还可以配置若干个例外路径!

在一般情况下,我们更关注项目的管理,由于过滤器和拦截器都会出现在真正处理请求的组件之前,所以,都可以实现“阻止”和“放行”的效果,那么,哪个简单、易用、功能更强大,就使用哪个!所以,更优先推荐使用拦截器解决项目中的问题!但是,这也并不代表拦截器就可以完全取代过滤器,例如,某些处理过程应该出现在更早的执行时间节点,就必须使用过滤器,而不能使用拦截器!

过滤器和拦截器

过滤器和拦截器触发时机不一样:过滤器是在请求进入容器后,但请求进入__servlet__之前进行预处理的。请求结束返回也是,是在__servlet__处理完后,返回给前端之前。
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
__拦截器可以获取__IOC__容器中的各个__bean__,而过滤器就不行,这点很重要,在拦截器里注入一个__service,可以调用业务逻辑。



你.LjWyH
30 声望3 粉丝