Servlet过滤器(Filter)技术是从Servlet2.3规范开始引入的。与Servlet技术一样,Servlet过滤器也是一种Web应用程序组件,可以部署在Web应用程序中。 过滤器的工作流程: 当Web服务器接收到一个请求后,将会判断此请求路径是否匹配到一个过滤器配置,如果匹配到,则服务器会把请求交给相关联的过滤器处理 过滤处理之后,Web服务器会判断是否有另一个关联的过滤器,如果存在继续交给下个处理 最后调用客户需要访问的Web资源,如JSP或Servlet。 在返回给客户端的过程中,首先同样经过关联的过滤器,只是顺序与请求到来时相反 过滤器的用途: 可以进行请求的权限判断。 可以处理文本乱码问题。 过滤器还有很多的其他用途,例如XML转换过滤、数据压缩过滤、图像转换过滤、加密过滤、请求与响应封装等。 创建Servlet过滤器的步骤: 1. 建立一个实现javax.servlet.Filter接口的类。实现接口中的三个方法:doFilter(),init(),destroy() 2. 在doFilter方法中添加需要完成某个过滤功能的代码。调用FilterChain对象的doFilter方法。在调用此对象的doFilter方法时,调用下一个相关的过滤器。如果没有其他的过滤器与所请求路径信息关联,那么会调用客户端请求的Web资源。 3. 对相应的Web资源注册过滤器。在部署描述符文件(web.xml)中使用 Filter接口: 所有过滤器都必须实现javax.servlet.Filter接口。这个接口包含三个方法,分别为: public void init(FilterConfigconfig) throws ServletException public void doFilter(ServletRequestrequest, ServletResponseresponse, FilterChainchain) throws ServletException,IOException public void destroy()public void destroy() FilterConfig接口: FilterConfig对象类似于ServletConfig对象。 FilterConfig对象与ServletConfig对象功能类似,通过init方法由容器创建并传递给Filter实现类使用。此接口中主要有以下几个方法: public String getFilterName() public String getInitParameter(Stringname) public Enumeration getInitParameterNames() ServletContext getServletContext() FilterChain接口: javax.servlet.FilterChain接口只有一个方法,方法声明如下 public void doFilter(ServletRequestrequest, ServletResponseresponse); Servlet过滤器的配置 ·Servlet过滤器必须配置在web.xml文件中 ·主要配置两个元素,分别是: – – Filter总结: Filter可以解决的问题:将一些共同的处理放到filter中处理,减少了每一个servlet分别处理的麻烦。 Filter过滤的对象:request,response Filter的执行顺序:参照web.xml配置的顺序, 注意事项: 1. 不同request,response才可以触发filter,也就是说请求转发,如:forward,因为是同一个request,因此不再经过filter,而sendRedict可以触发filter。 2. 可以参与过滤的资源必须包含request,response对象 下面是例子: package com.neu.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class filter1 implements Filter { public void destroy() { // TODO Auto-generated method stub
} public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { // TODO Auto-generated method stub System.out.println('2'); arg2.doFilter(arg0, arg1); /*告诉服务器这个过滤器已经执行过了,可以继续向下执行了*/ /*Causes the next filter in the chain to be invoked * , or if the calling filter is the last filter in the chain * , causes the resource at the end of the chain to be invoked.*/ } public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } } <filter> <filter-name>Filter1filter-name> <filter-class>com.neu.filter.filter1filter-class> filter> <filter-mapping> <filter-name>Filter1filter-name> <url-pattern>/*url-pattern> filter-mapping> |
|