Servlet 过滤
Servlet 过滤提供名为过滤器的新类型对象,它可以变换请求或修改响应。
您可以将过滤器链接在一起,这样一组过滤器就可以对指定资源或资源组的输入和输出起作用。
过滤器通常包含记录过滤器、图像转换过滤器、加密过滤器和多用途因特网邮件扩展 (MIME) 类型过滤器(其功能等价于 Servlet 链接)。尽管过滤器不是 Servlet,但它们的生命周期非常相似。
以下列方式处理过滤器:
- Web 容器确定是否需要构造包含请求资源的 LoggingFilter 的 FilterChain。
FilterChain 以调用 LoggingFilter 开始并以调用请求的资源结束。
- 如果其他过滤器需要加入到链,那么 Web 容器会将它们放在 theLoggingFilter 之后和请求的资源之前。
- 然后 Web 容器实例化和初始化 LoggingFilter(如果先前它没有完成的话),并且调用它的 doFilter(FilterConfig) 方法以启动链。
- LoggingFilter 预处理请求和响应对象,然后调用过滤器链 doFilter(ServletRequest, ServletResponse) 方法。
此方法将处理传递到链中的下一个资源(即,所请求的资源)。
- 在从过滤器链 doFilter(ServletRequest, ServletResponse) 方法返回后,LoggingFilter 在将响应发送回客户机之前,对请求和响应对象执行后处理。
Java™ Servlet Specification 2.4 使您可以在部署描述符中使用可能值(如 REQUEST、FORWARD、INCLUDE、ERROR)定义新的 <dispatcher> 元素,而不是使用 RequestDispatcher 调用过滤器。
Java Servlet Specification 3.0 使您可以在部署描述符中使用可能值(如 ASYNC、REQUEST、FORWARD、INCLUDE、ERROR)定义新的 <dispatcher> 元素,而不是使用 RequestDispatcher 调用过滤器。
例如:
<filter-mapping>
<filter-name>Logging Filter</filter-name>
<url-pattern>/products/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
这表明过滤器应该应用于直接来自客户机的请求和转发请求。添加 INCLUDE 和 ERROR 值,还表示过滤器另外应该应用于已包含请求和 <error-page> 请求。 如果没有指定任何 <dispatcher> 元素,那么缺省值为 REQUEST。
Servlet 过滤的 Filter、FilterChain、FilterConfig 类
以下接口定义为 javax.Servlet 包的一部分:
- Filter 接口 - 方法:doFilter、getFilterConfig 和 setFilterConfig
- FilterChain 接口 - 方法:doFilter
- FilterConfig 接口 - 方法:getFilterName、getInitParameter、getInitParameterNames 和 getServletContext
以下类定义为 javax.Servlet.http 包的一部分:
- HttpServletRequestWrapper - methods:请参阅 Servlet 2.4 规范
- HttpServletResponseWrapper - methods:请参阅 Servlet 2.4 规范