- 过滤器的使用
过滤器概述:过滤器是在源数据和目的数据之间起过滤作用的中间组件,对web应用来说,过滤器是一个驻留在服务器端的web组件,它可以截取客户端和资源之间的请求和响应信息,并对这些信息进行过滤。
当web容器接收到一个对资源的请求时,它将判断是否有过滤器与这个资源相关联,如果有,那么容器将把这个请求交给过滤器处理,在过滤器中,你可以改变请求的内容,或者重新设置请求的报头信息,然后再将请求发送给目标资源。当目标资源对请求作出响应时,容器同样会将响应先转发给过滤器。在过滤器中,还可以对响应的内容进行转换,然后再将响应发送给客户端,
过滤器在web开发中的应用:
- 对用户进行统一认证
- 对用户的访问请求进行记录和审核
- 对用户发送的数据进行过滤或替换
- 转换图像格式
- 对相应内容分进行压缩,减少传输量
- 对请求或响应进行加解密处理
- 出发资源访问事件
Filter API:
与过滤器开发相关的接口和类都包含在javax.servlet和javax.servlet.http包中,接口和类主要有:javax.servlet.Filter接口,javax.servlet.FilterConfig接口,javax.servlet.FilterChain接口,javax.servlet.ServletRequestWrapper类,javax.servlet.ServletResponseWrapper类javaxservlet.http.HttpServletRequestWrapper类javax.servlet.http.HttpServletResponseWrapper类
- Filterj接口
开发过滤器要实现javx.servlet.Filter接口,与开发Servlet要实现javax.servlet.Servlet接口类似,提供一个公开的不带参数的构造方法。在Filter接口中,定义了以下三个方法:
1.public void init(FilterConfig filterConfig)throws ServletException
Web容器调用该方法来初始化过滤器。容器在调用该方法时,向过滤器传递FilterConfig对象,FilterConfig的用法与ServletConfig的用法类似利用FilterConfig对象可以得到ServletContext对象,以及部署描述符中配置的过滤器的初始化参数。在这个方法中,可以抛出ServletException异常,通知容器该过滤器不能正常工作
- public void doFilter(ServletRequest request,ServletResponse response,FilterChainchain)throw java.io,IOException,ServletExxception
doFilter()方法类似于Servlet的service()方法。当客户端请求目标资源时,容器就会调用与这个目标资源相关联的过滤器的doFilter()方法,在特定的操作完成后,可以调用chain.doFilter(request,response)将请求传送给下一个过滤器(或目标资源),也可以直接向客户端返回响应信息,或者利用requestDispatcher()的forword()和include()方法,以及HttpServletResponse()的sendRedirect()方法将请求转发到其他资源。需要注意的是,需要注意的是,这个方法的请求和响应参数是ServletRequest和ServletResponse,也就是说,过滤器的使用并不依赖于具体的协议。
(3)public void destroy()
Web容器调用该方法指示该过滤器的生命周期结束,在这个方法中,可以释放过滤器使用的资源。与开发Servlet不同的是,Filter接口并没有相应的实现类可供继承,要开发过滤器只能直接实现Filter接口。
- FilterConfig接口
Javax.servlet.FilterConfig接口类似于javax.servlet.ServletConfig接口,用于在过滤器初始化时,向其传递信息,FilterConfig接口有容器实现,容器将其作为参数传入过滤器对象的init()方法中。在FilterConfig接口定义了四个方法:
- public String getFilterName():得到描述符中指定的过滤器的名字。
- Public 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,ServletReponse response)throws java.io.IOException方法,调用该方法将使得该过滤器的下一个过滤器被调用,如果是最后一个过滤器,则会电泳目标资源。
- 过滤器的部署
在实现一个过滤器后,需要在部署描述符中对过滤器进行配置,这是通过<filter>和<filter-mapping>元素来完成的。
在web应用程序中<filter>元素用于声明一个过滤器
在<filter>元素内,<discription>,<display-name><icon>元素与以往的Servlet配置中的相同,<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空,<filter-class>用于与指定过滤器完整的类名,<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>用于指定参数的名字,<param-value>元素指定参数的值,在过滤器中可以使用FilterConfig接口对象来访问初始化参数。
如下所示:
<filter>
<filter-name>不可空</filter-name>
<filter-class>完整类名</filter-class>
<init-param>
<param-name>初始化参数名</param-name>
<param-value>初始化参数值</param-value>
</init-param>
</filter>
Servlet容器对部署描述符中声明的每一个过滤器只创建一个实例,与Servlet类似容器将在同一个过滤器实例上运行多个线程来同时为多个请求服务(Filter与Servlet均为多线程编程),因此,在开发过滤器的过程中,也要注意线程安全问题。<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,FORWORD和·ERROR之一,默认的是EQUEST
REQUST:当用户直接访问页面时,web容器将会调用过滤器,如果目标资源是通过Request Dispatch的include或forword方法访问的,那么该过滤器将不会被调用。
INCLUDE:如果目标资源是通过RequestDispatcher的include()访问的,那么该过滤器将会被调用,反之,该过滤器不会被调用。
FORWORD:如果目标资源是通过RequsetDispatcher的forword()访问的,那么该过滤器将会被调用,反之,该过滤器将不会被调用。
ERROR:如果目标资源是通过声明式异常处理机制调用的,那么该过滤器将会被调用,反之,该过滤器将不会被调用。
<filter-mapping>
<filter-name>与<filter>中的一致</filter-name>
<url-pattern>/test.jsp</url-pattern>
</filter-mapping>
当用户访问test.jsp时容器就会调用相应的过滤器
<filter-mapping>
<filter-name></filter-name>
<url-pattern>/index.jsp</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWORD</dispatcher>
</filter-mapping>
当用户直接访问index.jsp页面,或者通过RequestDispatcher的forword()方法访问时,容器就会调用相应的过滤器。
- Filter用户权限控制