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

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

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

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

Filter

interceptor

多个的执行顺序

根据filter mapping配置的先后顺序

按照配置的顺序,但是可以通过order控制顺序

规范

在Servlet规范中定义的,是Servlet容器支持的

Spring容器内的,是Spring框架支持的。

使用范围

只能用于Web程序中

既可以用于Web程序,也可以用于Application、Swing程序中。

深度

Filter在只在Servlet前后起作用

拦截器能够深入到方法前后、异常抛出前后等

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

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