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>和<filter-mapping>元素注册过滤器组件。
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-mapping>
Filter总结:
Filter可以解决的问题:将一些共同的处理放到filter中处理,减少了每一个servlet分别处理的麻烦。
Filter过滤的对象:request,response
Filter的执行顺序:参照web.xml配置的顺序,<filter-mapping>放置的前后顺序,谁在前,先执行谁。不过要注意的是,每个filter一定是<filter>在<filter-mapping>前,不然服务器启动会出现错误。
注意事项:
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>Filter1</filter-name>
<filter-class>com.neu.filter.filter1</filter-class>
</filter>
<filter-mapping>
<filter-name>Filter1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>