过滤器的实现

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();
}

你可能感兴趣的:(过滤器的实现)