Filter(过滤器)

晨曦之光 发布于 2012/05/16 17:05
阅读 811
收藏 3


Filter简介:

可以使用户改变一个Request和修改一个Response,Filter不是Servlet,他不能产生一个Response。但他能够在Request到达Servlet之前预处理Request,也可以在离开Request时处理Response,Filter是一个Servlet链

用户可以配置一个Filter到一个或多个Servlet,一个或多个Servlet也可以被一个或多个Filter使用,一个Filter必须使用java.servlet。Filter接口定义有三个方法:destory方法,,doFilter方法,init方法

Filter的工作原理:

当客户端发出请求时,web服务器根据应用程序设置的过滤配置文件进行检查,若满足过滤要求,则进行拦截,对请求头和请求数据进行检查或改动,并依次通过过滤器链,最后把请求或响应交给请求的web资源进行处理。请求信息可以在过滤链中进行修改,也可以根据条件让请求不发往资源管理器,并直接向客户机发回一个响应,当资源处理器完成了对资源的处理后,响应信息将逐级逆向返回。

过滤器的生命周期:

实现过滤器的过程中必须实现java.servlet包中的Filter的三个方法:init()方法,destory()方法,doFilter()方法,即使是空方法,也要实现;启动服务器时加载过滤器的实例,并调用init()方法实现初始化;每一次请求时都只调用doFilter()方法;服务器停止时调用destory方法销毁实例

Servlet过滤器API:

Servlet过滤器API包含了3个接口,它们都在javax.servlet包中,分别是Filter接口、FilterChain接口和FilterConfig接口。

  public Interface Filter
    所有的过滤器都必须实现Filter接口。该接口定义了init,doFilter0,destory()三个方法:
    (1)public void init(FilterConfigfilterConfig)throws ServletException
    当开始使用servlet过滤器服务时,Web容器调用此方法一次,为服务准备过滤器;然后在需要使用过滤器的时候调用doFilter(),传送给此方法的FilterConfig对象,包含servlet过滤器的初始化参数。
    (2public void doFilter(ServletRequest req, ServletResponseresp,FilterChain chain) throws IOException, ServletException)

每个过滤器都接受当前的请求和响应,且FilterChain过滤器链中的过滤器(应该都是符合条件的)都会被执行。doFilter方 法中,过滤器可以对请求和响应做它想做的一切,通过调用他们的方法收集数据,或者给对象添加新的行为。过滤器通过传送至此方法的FilterChain参数,调用chain.doFilterO将控制权传送给下一个过滤器。当这个调用返回后,过滤器可以在它的 Filter方法的最后对响应做些其他的工作。如果过滤器想要终止请求的处理或得到对响应的完全控制,则可以不调用下一个过滤器,而将其重定向至其它一些页面。当链中的最后一个过滤器调用chain.doFilterO方法时,将运行最初请求的Servlet。

(3)publicvoid destroy()
     一旦doFilterO方法里的所有线程退出或已超时,容器调用此方法。服务器调用destoryO以指出过滤器已结束服务,用于释放过滤器占用的资源。

 public interface FilterChain

public voiddoFilter(ServletRequest request,ServletResponse response) thlows java.io.IOException,ServletException

此方法是由Servlet容器提供给开发者的,用于对资源请求过滤链的依次调用,通过FilterChain调用过滤链中的下一个过滤器,如果是最后一个过滤器,则下一个就调用目标资源。

 public interface FilterConfig

    FilterConfig接口检索过滤器名、初始化参数以及活动的Servlet上下文。该接口提供了以下4个方法:

(1)public java.1ang.String getFilterName0返回web.xml部署文件中定义的该过滤器的名称。
(2)public ServletContext getServletContextO返回调用者所处的servlet上下文。
(3)publicjava.1ang.String getlnitParameter(java.1ang.String name)返回过滤器初始化参数值的字符串形式,当参数不存在时,返回nul1.name是初始化参数名。
(4)publicjava.util.Enumeration getlnitParameterNames()以Enumeration形式返回过滤器所有初始化参数值,如果没有初始化参数,返回为空。

过滤器相关接口工作流程

从编程的角度看,过滤器类将实现Filter接口,然后使用这个过滤器类中的FilterChain和FilterConfig接口。该过滤器类的

— 个引用将传递给FilterChain对象,以允许过滤器把控制权传递给链中的下一个资源。FilterConfig对象将由容器提供给过滤
器,以允许访问该过滤器的初始化数据。

过滤器配置

  过滤器通过Web应用程序中的配置描述符web.xml文件中的明,包括部分:

过滤器定义,由<filter>元素表示,主要包括<filter-name>和<filter-class>两个必须的子元素和<icon>、<init-param>,<display-name>,<description>这4个可选的子元素。<filter-name>子元素定义了—个过滤器的名字,<filter-class>指定了由容器载入的实际类,<init-param>子元素为过滤器提供初始化参数。

<filter-mapping> 主要由<filter-name>,<servlet-name>和<url-pattem>子元素组成。<servlet-name>将过滤器映射到一个或多个Servlet上,<url-pattem>将过滤器映射到—个或多个任意特征的URL的JSP页面。

 

 



原文链接:http://blog.csdn.net/xy849288321/article/details/7004705
加载中
0
不曾走远6666
不曾走远6666
我想通过filter记录用户浏览器等信息,该怎么做?
JavaOlder
JavaOlder
在session里获取信息。
0
水牛叔叔
水牛叔叔

不知道你要记录什么信息? 比如你可以在filter里操作数据库,又比如你还可以在filter里写个static变量记录在线用户····

返回顶部
顶部