一个中间组件,用于拦截源数据和目的数据之间的消息
过滤二者之间传递的数据
Web应用上的过滤器
驻留在Web服务器上的Web组件
过滤从客户端传递到服务器端的请求和响应
在Web应用程序中部署过滤器,对客户端和目标资源来说都是透明的,他们并不需要知道过滤器的存在。
Web应用上部署多个过滤器
过滤器的一些常见应用:
1:认证过滤:对用户请求进行统一的认证。
2:登录和审核过滤:对用户的访问请求进行记录和审核。
3:图像转换过滤:转换图像格式。
4:数据压缩过滤 :对用户发生的数据进行压缩,从而减少传输量。
5:加密过滤:对请求和响应进行加密解密处理。
6:令牌过滤
7:资源访问触发事件过滤
8:XSLT过滤
9:MIME-type过滤
HelloWorldFilter – 编码、编译
所有的过滤器必须实现javax.servlet.Filter接口
public class HelloWorldFilter implements Filter {
private FilterConfig filterConfig;
public void init(FilterConfig filterConfig) {
this.filterConfig = filterConfig;
}
public void doFilter( ServletRequest request, ServletResponse response,
FilterChain filterChain
) throws ServletException, IOException {
PrintWriter pw = response.getWriter();
……
}
public void destroy() {
}
}
HelloWorldFilter – 部署
将编译好的class文件放置在Web应用程序的classes目录下
在部署文件web.xml中添加过滤器的注册与映射
<!—指定过滤器名和过滤器类-->
<filter>
<filter-name>HelloWorldFilter</filter-name>
<filter-class>com.lovobook.HelloWorldFilter</filter-class>
</filter>
<!-- 将过滤器与URL模式关联-->
<filter-mapping>
<filter-name>HelloWorldFilter</filter-name>
<url-pattern>/filter/*</url-pattern>
</filter-mapping>
过滤器API
由容器实现的接口
javax.servlet.Filter
javax.servlet.FilterChain
javax.servlet.FilterConfig
四个包装器类
javax.servlet.ServletRequestWrapper
javax.servlet.ServletResponseWrapper
javax.servlet.http.HttpServletRequestWrapper
javax.servlet.http.HttpServletResponseWrapper
Filter接口
方法 |
描述 |
void init(FilterConfig) |
在应用程序启动时,由容器调用 |
void doFilter(ServletRequest, ServletResponse, FilterChain) |
对于每个URL映射到该过滤器的请求,由容器调用该方法。 |
void destroy() |
FilterConfig接口
方法 |
描述 |
String getFilterName() |
返回在部署描述文件中指定的过滤器的名称 |
String getInitParameter(String) |
返回在部署描述文件中指定的参数的值 |
Enumeration getInitParameterNames() |
返回在部署描述文件中指定的所有参数的名称。 |
ServletContext getServletContext() |
返回Web应用程序的ServletContext。过滤器可以使用Ser |
FilterChain接口
由容器实现
将请求传递到过滤器链的下一个组件
方法 |
描述 |
void doFilter(ServletRequest, ServletResponse) |
我们从一个过滤器对象的doFilter() |
<filter>
<filter-name>ValidatorFilter</filter-name>
<description>Validates the requests</description>
<filter-class>com.lovobook.filters.ValidatorFilter</filter-class>
<init-param>
<param-name>locale</param-name>
<param-value>USA</param-value>
</init-param>
</filter>
<filter-mapping>元素
<filter-mapping>
<filter-name>ValidatorFilter</filter-name>
<url-pattern>*.doc</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>ValidatorFilter</filter-name>
<servlet-name>reportServlet</servlet-name>
</filter-mapping>
配置过滤器链
用多个过滤器处理在同一个请求
使用多个<filter-mapping>元素配置过滤器链
首先调用匹配请求URI的过滤器 <url-pattern>
再查找用Servlet名匹配请求URI的所有过滤器<servlet-name>
过滤器的顺序按照它们在部署描述文件中出现的顺序排序
<filter-mapping>
<filter-name>FilterA</filter-name>
<servlet-name>RedServlet</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>FilterB</filter-name>
<url-pattern>*.red</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>RedServlet</servlet-name>
<url-pattern>*.red</url-pattern>
</servlet-mapping>
总结
过滤器是驻留在Web服务器上的Web组件,它可以过滤从客户端传递到服务器端的请求和响应
可以部署多个过滤器,这些过滤器组成一个过滤器链
过滤器API包括Filter、FilterConfig、FilterChain三个接口
过滤器的包装器类可以更改请求和响应的内容
过滤器生命周期包括初始化、过滤、销毁三个阶段
部署描述文件中使用<filter>和<filter-mapping>元素进行配置
过滤器链中容器会先调用匹配请求URI的过滤器,然后才是匹配servlet名的过滤器