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版权协议,转载请附上原文出处链接和本声明。