Filter过滤器的生命周期和工作原理

一、Filter是什么?

Filter:过滤器,它需要实现javax.servlet.Filter接口。Filter是过滤器,与拦截器不同。过滤器是先于与之相关的Servlet和JSP运行在服务器上。

通过配置web.xml文件声明它过滤的路径:

<filter>  
  <filter-name>XXXFilter</filter-name>  
  <filter-class>  
     com.XXX.XXXFilter
  </filter-class>  
</filter>  

<filter-mapping>  
  <filter-name>XXXFilter</filter-name>  
  <url-pattern>*.action</url-pattern>  
</filter-mapping>

过滤器可附加到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息。在这之后,过滤器可以作如下的选择:

  1. 以常规的方式调用资源(即,调用servlet或JSP页面)。
  2. 利用修改过的请求信息调用资源。
  3. 调用资源,但在发送响应到客户机前对其进行修改。
  4. 阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。

二、Filter的生命周期

程序启动调用Filter的init()方法(永远只调用一次),程序停止调用Filter的destroy()方法(永远只调用一次),doFilter()方法每次的访问请求如果符合拦截条件都会调用(程序第一次运行,会在servlet调用init()方法以后调用,不管第几次,都在调用doGet(),doPost()方法之前)。

三、Servlet中过滤器的工作原理

在Servlet作为过滤器使用时,它可以对客户的请求进行处理。处理完成后,它会交给下一个过滤器处理,这样,客户的请求在过滤链里逐个处理,直到请求发送到目标为止。

例如,某网站里有提交“修改的注册信息”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话是否有效;对提交的数据进行统一编码。这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。

四、过滤器与拦截器的不同之处

既然之前提到了拦截器,那么我们来说说过滤器与拦截器有何不同:

Filterinterceptor
多个的执行顺序根据filter mapping配置的先后顺序按照配置的顺序,但是可以通过order控制顺序
规范在Servlet规范中定义的,是Servlet容器支持的Spring容器内的,是Spring框架支持的。
使用范围只能用于Web程序中既可以用于Web程序,也可以用于Application、Swing程序中。
深度Filter在只在Servlet前后起作用拦截器能够深入到方法前后、异常抛出前后等

总结:两者的本质区别:拦截器是基于java的反射机制的,而过滤器是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,他都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。

参考:
1.Listener,Filter,Servlet执行顺序和生命周期
2.filter过滤器 和拦截器的区别

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Filter过滤器)是 Java Web 应用程序中的一种组件,它可以拦截 HTTP 请求和响应,对它们进行处理,然后将它们传递给目标 Servlet 或 JSP 页面,或者阻止它们的传递。Filter过滤器)通常用于对请求进行预处理、对响应进行后处理、以及对请求和响应进行过滤和验证等操作。 Filter过滤器)的生命周期包括初始化、处理请求和响应、以及销毁等阶段。在 Web 应用程序启动时,容器会调用每个 Filter 的 init() 方法进行初始化,然后在每个 HTTP 请求到达时,容器会调用每个 Filter 的 doFilter() 方法对请求和响应进行处理,最后在 Web 应用程序关闭时,容器会调用每个 Filter 的 destroy() 方法进行销毁。 Filter过滤器)的原理是通过 Java 的动态代理技术,将 Filter 对象包装成一个代理对象,然后将代理对象插入到 Servlet 容器的调用链中,实现对 HTTP 请求和响应的拦截和处理。 Filter过滤器)的主要方法包括 init()、doFilter() 和 destroy() 方法。其中,init() 方法用于初始化 Filter 对象,在 Web 应用程序启动时调用;doFilter() 方法用于处理 HTTP 请求和响应,在每个 HTTP 请求到达时调用;destroy() 方法用于销毁 Filter 对象,在 Web 应用程序关闭时调用。在 doFilter() 方法中,还可以使用 FilterChain 对象将请求和响应传递给下一个 Filter 或目标 Servlet 或 JSP 页面。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值