Filter过滤器API
Servlet过滤器API包含了3个接口,它们都在javax.servlet包中,分别是Filter接口、FilterChain接口和FilterConfig接口。
Filter接口(源码)
public interface Filter {
public void init(FilterConfig filterConfig) throws ServletException;
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
public void destroy();
}
所有的过滤器都要实现Filter接口,该接口定义了init(),doFilter(),destory()三个方法。
1.init(FilterConfig filterConfig)
- 在web应用程序启动时,web服务器将根据web.xml中的配置信息来创建每个注册的filter实例对象,并将其保存在服务器的内存中。
- Web中创建Filter实例之后立即调用该Filter的init()方法。init()方法在Filter生命周期中只执行一次。
- Web容器在调用init方法时,会传递一个包含Filter配置和运行环境的FilterConfig对象。利用FilterConfig对象可以获得ServletContext对象,以及部署描述中配置的过滤器的初始化参数。
2.doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
- doFilter()方法类似于Servlet接口的Service方法;
- 当客户端请求目标资源的时候,容器就会调用与这个目标资源相关过滤器的doFilter()方法。其中参数 request, response 为 web 容器或 Filter 链的上一个 Filter 传递过来的请求和相应对象;参数 chain 为代表当前 Filter 链的对象。
- 特定操作完成后,可以在当前 Filter 对象的 doFilter 方法内部需要调用 FilterChain 对象的 chain.doFilter(request,response)方法才能把请求交付给 Filter 链中的下一个 Filter 或者目标 Servlet 程序去处理,也可以直接向客户端返回响应信息,或者利用RequestDispatcher的forward()和include()方法,以及 HttpServletResponse的sendRedirect()方法将请求转向到其他资源。这个方法的请求和响应参数的类型是 ServletRequest和ServletResponse,也就是说,过滤器的使用并不依赖于具体的协议。
3. public void destory()
- 在web容器卸载Filter对象之前被调用。
- 该方法在Filter生命周期中只执行一次,通过这个方法可以释放过滤器使用的资源。
FilterChain接口
public interface FilterChain {
public void doFilter(ServletRequest request, ServletResponse response)
throws IOException, ServletException;
}
- 此方法是由Servlet容器提供给开发者的,用于对资源请求过滤链的依次调用,通过FilterChain调用过滤链中的下一个过滤 器,如果是最后一个过滤器,则下一个就调用目标资源。
FilterCOnfig接口
public interface FilterConfig {
//返回web.xml部署文件中定义的该过滤器的名称
public String getFilterName();
//返回调用者所处的servlet上下文
public ServletContext getServletContext();
//返回过滤器初始化参数值的字符串形式,当参数不存在时,返回nul1.name是初始化参数名
public String getInitParameter(String name);
//以Enumeration形式返回过滤器所有初始化参数值,如果没有初始化参数,返回为空
public Enumeration getInitParameterNames();
}