java WEB开发中的过滤器接口Filter
Filter在Web开发中的应用。
过滤器概述:
过滤器就是在源数据和目的数据之间起过滤作用的中间组件。对Web应用来说,过滤器是一个驻留在服务器端的Web组件,它可以截取客户端和资源之间的请求与响应信息,并对这些信息进行过滤。当Web容器接受到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联。如果有,那么容器将把请求交给过滤器进行处理。在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。当目标资源对请求作出响应时候,容器同样会将响应先转发给过滤器,再过滤器中,你可以对响应的内容进行转换,然后再将响应发送到客户端。
与过滤器开发相关的接口与类都包含在javax.serlvet和javax.servlet.http包中,主要有下面的接口和类。
·javax.servlet.Filter接口
·javax.servlet.FilterConfig接口
·javax.servlet.FilterChain接口
·javax.servlet.ServletRequestWrapper类
·javax.servlet.ServletResponseWrapper类
·javax.servlet.http.HttpServletRequestWrapper类
·javax.servlet.http.HttpServletResponseWrapper类
Filter接口:
开发过滤器要实现javax.servlet.Filter接口,与开发servlet要实现javax.servlet.Servlet接口类似。提供了一个公开的不带参数的构造方法。在Filter接口中,定义了下面的三个方法:·public void init(FilterConfig filterConfig)throws ServletExceptionWeb容器调用该方法该方法来初始化过滤器。容器在调用该方法时,向过滤器传递FIlterConfig对象,FilterConfig的用法和ServletConfig(参见以前相关内容)类似。利用FilterConfig对象可以得到ServletContext对象,以及部署描述符中配置的过滤器的初始化参数。在这个方法中,可以抛出ServletException异常,通知容器该过滤器不能正常工作。·public void doFilter(ServletRequest request,ServletResponseresponse,FilterChain chain)throws java.io.IOException,ServletExceptiondoFilter()方法类似于Servlet接口service()方法。当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的doFilter()方法。在特定的操作完成后,可以调用chain.doFilter(request,response)将请求传给下一个过滤器(或目标资源),也可以直接向客户端返回响应信息,或者用RequestDispatcher的forward()和include()方法,以及HttpServletResponse的sendRedirect()方法将请求转向到其他资源。需要注意的是,这个方法的请求和响应参数的类型是ServletRequest和ServletResponse,也就是说,过滤器的使用并不依赖于具体的协议。·public void destroy()Web容器调用该方法指示过滤器的生命周期结束。在这个方法中,可以释放过滤器使用的资源。与开发Servlet不同的是,Filter接口并没有相应的实现类可供继承,要开发过滤器,只能直接实现Filter接口。
FilterConfig接口:
javax.servlet.FilterConfig接口类似于javax.servlet.ServletConfig接口,用于在过滤器初始化时,向其传递信息。FilterConfig接口有容器实现,容器将其作为参数传入过滤器对象的init()方法中。在FilterConfig接口,定义了4个方法:·public java.lang.String getFilterName()得到描述符中指定的过滤器的名字。
·public java.lang.String getInitParameter(java.lang.String name)----- 返回在部署描述中指定的名字为name的初始化参数的值。如果不存在返回null.
·public java.util.Enumeration getInitParameterNames()---- 返回过滤器的所有初始化参数的名字的枚举集合。
·public ServletContext getServletContext()-----返回Servlet上下文对象的引用。
FilterChain接口:
FilterChain接口由容器实现,容器将其实例作为参数传入过滤器对象的doFilter()方法中。过滤器对象使用FilterChain对象调用过滤器链中的下一个过滤器,如果该过滤器是链中最后一个过滤器,那么将调用目标资源。FilterChain接口只有一个方法,如下:·public void doFilter(ServletRequest request,ServletResponse response)throws java.io.IOException调用该方法将使过滤器链中的下一个过滤器被调用。如果是最后一个过滤器,会调用目标资源。
过滤器的部署:
在WebRoot下面的Web.hml中
在实现一个过滤器后,需要在部署描述符中对过滤器进行配置,这是通过<filter>和<filter-mapping>元素来完成的。
在<filter>元素内,<description>、<display-name>、<icon>元素和以往servlet的配置中的相同。<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。<filter-class>元素用于指定过滤器的完整的限定类名。<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。
<filter-mapping>元素用于指定过滤器关联的url样式或者Servlet。其中<filter-name>子元素的值必须是在<filter>元素中声明过的过滤器的名字。<url- pattern>元素和<servlet-name>元素可以选择一个;<url-pattern>元素指定过滤器关联的 URL样式<servlet-name>元素指定过滤器对应的Servlet。用户在访问<url-pattern>元素指定的URL上的资源或<servlet-name>元素指定的Servlet时,该过滤器才会被容器调用。<filter- mapping>元素还可以包含0到4个<dispatcher>,指定过滤器对应的请求方式,可以是 REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST.
·REQUEST--------当用户直接访问也面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。
·INCLUDE--------- 如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
·FORWARD-------如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。
·ERROR--------如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
这是我的一个部署例子:
——————————————————————————————————————
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<filter>
<filter-name>MyFilter</filter-name> //设置过滤器的名字
<filter-class>MyFilter</filter-class> //指明过滤器的完整的限定类名
<init-param>
<param-name>my_filter</param-name> //--------见下一行
<param-value>login.jsp</param-value> //将<param-name>指定参数的名字和<param-value>指定参数的值联系在一起,此时my_filter的值就为login.jsp
</init-param>
</filter>
//-------------------------------------<filter-mapping>元素用于指定过滤器关联的url样式或者Servlet。
<filter-mapping>
<filter-name>MyFilter</filter-name> //<filter-name>子元素的值必须是在<filter>元素中声明过的过滤器的名字
<url-pattern>/*</url-pattern> //指定过滤器关联的 URL样式(在本例子中只要在访问时有 / 这个符号,就会调用MyFilter过滤器)
</filter-mapping>
————————————————————————————————————