Servlet之Filter

Filter是Servlet规范定义的。实现一般是容器,如Tomcat。

  • Filter设计主要有三个接口,Filter,FilterChain,FilterConfig。
  • Filter是FilterChain和FilterConfig的使用者、管理者。
  • Filter需要有注册动作才能被容器识别到,一旦容器启动,Filter数量、类型、顺序就是确定了的。
  • Filter的注册方式有2种,一种是使用@WebFilter("/user"),一种是在web.xml中配置<Filter>标签。
  • Filter需要拦截的path信息是在FilterConfig中,具体实现类是org.apache.catalina.core.ApplicationFilterConfig。
package javax.servlet;

import java.io.IOException;

public interface Filter {
    // 初始化方法,容器创建Filter对象后,立即调用init方法,整个生命周期中只执行一次。
    // 在init方法成功(失败如抛异常等)执行完前,不能提供过滤服务。
    // 参数FilterConfig用于获取初始化参数
    public default void init(FilterConfig filterConfig) throws ServletException {}

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException;

    public default void destroy() {}
}
package javax.servlet;

import java.io.IOException;

public interface FilterChain {

    public void doFilter(ServletRequest request, ServletResponse response)
            throws IOException, ServletException;

}
package javax.servlet;

import java.util.Enumeration;

public interface FilterConfig {

    public String getFilterName();

    public ServletContext getServletContext();

    public String getInitParameter(String name);

    public Enumeration<String> getInitParameterNames();

}

 我们需要理解的有2点,一是你定义的Filter是如何被Tomcat扫描到的,二是FilterChain是如何生成的。

 


版权声明:本文为tales522原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。