过滤器和拦截器的区别

一.过滤器:

过滤器配置比较简单,实现filter接口即可,也可以通过@WebFilter接口注解,对特定url进行拦截,接口中定义了三个方法

1.init() :该方法在容器启动初始化过滤器时被调用,它在 Filter 的整个生命周期只会被调用一次。注意:这个方法必须执行成功,否则过滤器会不起作用。

2.doFilter() :容器中的每一次请求都会调用该方法, FilterChain 用来调用下一个过滤器 Filter。

3.destroy(): 当容器销毁 过滤器实例时调用该方法,一般在方法中销毁或关闭资源,在过滤器 Filter 的整个生命周期也只会被调用一次

二.拦截器

一个应用中可能存在多个拦截器,链式调用,一个请求也可以触发多个拦截器,每个拦截器的执行顺序会依据声明顺序执行

请求的拦截是通过HandlerInterceptor 来实现,看到HandlerInterceptor 接口中也定义了三个方法

1.preHandle() :这个方法将在请求处理之前进行调用。注意:如果该方法的返回值为false ,将视为当前请求结束,不仅自身的拦截器会失效,还会导致其他的拦截器也不再执行。

2.postHandle():只有在 preHandle() 方法返回值为true 时才会执行。会在Controller 中的方法调用之后,DispatcherServlet 返回渲染视图之前被调用。 有意思的是:postHandle() 方法被调用的顺序跟 preHandle() 是相反的,先声明的拦截器 preHandle() 方法先执行,而postHandle()方法反而会后执行。

3.afterCompletion():只有在 preHandle() 方法返回值为true 时才会执行。在整个请求结束之后, DispatcherServlet 渲染了对应的视图之后执行。

三.过滤器和拦截器都实现了AOP编程思想,都可以实现日志记录,登录权限等功能

四。不同点

1.过滤器和拦截器 底层实现方式大不相同,过滤器 是基于函数回调的,拦截器 则是基于Java的反射机制(动态代理)实现的。

2.使用范围不同,过滤器只能在web程序中使用(tomcat),而拦截器是spring一个组件,不依赖tomcat,不仅能用在web程序,也可以用在Application,Swing中

3.触发时机不同,过滤器是在请求进入容器之后servlet之前执行的,而且在servlet执完之后 ,执行的,拦截器是在请求进入servlet之后在conller之前执行的,Controller渲染视图之后请求结束

4.注入bean情况不同

5.控制执行顺序不同,开发过程中,会出现多个拦截器的情况,有时会希望某一个优先执行,

过滤器用@Order注解控制执行顺序,值越小级别越高优先执行,拦截器按照声明顺序执行

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值