【JavaWeb过滤器原理】

Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用。

Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request Header和Request内容。

在Servlet被调用之后检查Response对象,修改Response Header和Response内容。

Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或HTML文件。

所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:

init(FilterConfig):这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。

在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数。

注意:一旦一个过滤器启动失败,会导致整个Web应用启动失败。

doFilter(ServletRequest, ServletResponse, FilterChain):这个方法完成实际的过滤操作。

扫描二维码关注公众号,回复: 234102 查看本文章

当客户请求访问与过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。

FilterChain参数用于访问后续过滤器。在这个方法中调用chain.doFilter()方法,用于调用过滤器链中后续过滤器的doFilter()方法,假如没有后续过滤器,那么就把客户请求传给相应的Web组件。

如果在这个方法中没有调用chain.doFilter()方法,客户请求不会到达所访问的Web组件。

destroy():Servlet容器在销毁过滤器实例前调用该方法,在这个方法中可以释放Servlet过滤器占用的资源。



 

实现一个过滤器后,需要在 web.xml 中进行注册和设置它所能拦截的资源。这可以通过<filter>和<filter-mapping>元素来完成的。

其配置方式和servlet非常类似,下面是具体的配置代码

<filter>

  <filter-name>testFilterConfig</filter-name>

  <filter-class>cn.itcast.filter.TestFilterConfigFilter</filter-class>

  <!-- 配置当前 Filter 的初始化参数 -->

  <init-param>

 <param-name>name</param-name>

 <param-value>Tom</param-value>

  </init-param>

  <init-param>

 <param-name>password</param-name>

 <param-value>123456</param-value>

  </init-param>

</filter>

<filter-mapping>

  <filter-name>testFilterConfig</filter-name>

  <url-pattern>/*</url-pattern>

</filter-mapping>

/*表示所有的url都需要被这个过滤器所过滤,在同一个 web.xml 文件中可以为同一个 Filter 设置多个映射。若一个 Filter 链中多次出现了同一个 Filter 程序,这个 Filter 程序的拦截处理过程将被多次执行

1、拦截器是基于java的反射机制的,而过滤器是基于函数回调

2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器

3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用

猜你喜欢

转载自gaojingsong.iteye.com/blog/2390740
今日推荐