1. 一句话概括什么是filter
过滤器是一个WebApp的“大门”,通过匹配的URL或者Servlet都要经过Filter。
2. filter的工作原理与过程
Filter的工作过程中维持一个栈:执行doFilter()是进栈,doFilter执行完毕后出栈。
3. filter的加载过程
4. filter的配置
a) 方式一:在web.xml中配置。
<filter>
<filter-name>ForwardFilter</filter-name>
<filter-class>Async.AsyncFilter</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>ForwardFilter</filter-name>
<url-pattern>/*</url-pattern> <span style="white-space:pre"> </span><!—匹配指定的URL,不能与servlet-name连用-->
<servlet-name>ServletA</servlet-name> <!—匹配指定的servlet-->
<dispatcher>FORWARD</dispatcher> <span style="white-space:pre"> </span><!—指定派发器类型,默认为REQUEST-->
</filter-mapping>
b) 方法二:在ServletContextListener的contextInitialize()方法中定义(不要在注解中进行定义,因为这样无法指定filters的执行顺序)
5. 请求包装器(HttpServletRequestWrapper)和响应包装器(HttpServletResponseWrapper)它们的继承关系如下,使用它们的目的就是构造一个它们的子类,对请求方法或者响应方法进行重写,来编写自己的request和response类。一个很好的使用就是:压缩过滤器的实现。
派发器种类
1. 普通请求派发器(REQUEST):一个普普通通的派发器,例如:使用sendRedirect()重定向的请求就是一个普通请求。
2. 转发请求派发器( FORWARD):所有使用转向的请求会被这类Filter截获。
3. 包含请求派发器(INCLUDE):来自JSP中的<jsp:include page= “...”>请求(不是<%@ include file= “...”>)
4. 错误请求派发器(ERROR)
5. 异步请求派发器(ASYNC):使用AsyncContext的dispatch()方法的请求,都是异步请求派发器。