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>
联系客服