过滤器 Filter
过滤器
-
作用: 对服务器接收的请求和响应给服务器的资源进行管理
-
生命周期: 服务器开启到服务器关闭
-
过滤器是链式操作的
-
根据规范建议的各种类型的过滤器:
身份验证过滤器(Authentication Filters)。
数据压缩过滤器(Data compression Filters)。
加密过滤器(Encryption Filters)。
触发资源访问事件过滤器。
图像转换过滤器(Image Conversion Filters)。
日志记录和审核过滤器(Logging and Auditing Filters)。
MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)。
标记化过滤器(Tokenizing Filters)。
XSL/T 过滤器(XSL/T Filters),转换 XML 内容。
使用
- javax.servlet.Filter类方法
init(FilterConfig filterConfig)
: 初始化方法,只会在加载一次,里面可调用传入的filterConfig参数获取初始化参数。destroy()
: 过滤器销毁时的回调方法doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
: 实际的过滤方法,filterChain参数用于访问后续过滤器,调用filterChain.doFilter(servletRequest, servletResponse)
后还会执行之后的代码,注意!;
- 简单的使用
- web.xml
<!-- 过滤器-->
<filter>
<filter-name>testFilter</filter-name>
<filter-class>cn.lzm.servlet.TestFilter</filter-class>
<init-param>
<param-name>name</param-name>
<param-value>test</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>testFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
- java代码
public class TestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init filter"); //初始化过滤器
Enumeration<String> initParameterNames = filterConfig.getInitParameterNames(); //获取init-param 配置的键名
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("html..."); //这个会执行
filterChain.doFilter(servletRequest, servletResponse);
System.out.println("html...end"); //这个也会执行
}
@Override
public void destroy() {
System.out.println("destroy filter"); //过滤器被销毁了
}
}
关于路径的配置
- 1.过滤所有资源
<filter>
<filter-name>testFilter</filter-name>
<filter-class>cn.lzm.servlet.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>testFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-
- 过滤指定文件类型,如.html,.jsp,用 *.html 没有 /
<filter>
<filter-name>testFilter</filter-name>
<filter-class>cn.lzm.servlet.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>testFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
- 3.过滤指定路径下,如/test下,就 /test/*
<filter>
<filter-name>testFilter</filter-name>
<filter-class>cn.lzm.servlet.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>testFilter</filter-name>
<url-pattern>/test/*</url-pattern>
</filter-mapping>
-
- 过滤指定的servlet,用servlet-name 代替 url-pattern
<filter>
<filter-name>testFilter</filter-name>
<filter-class>cn.lzm.servlet.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>testFilter</filter-name>
<servlet-name>homeServlet</servlet-name>
</filter-mapping>
-
- 过滤指定文件,如/test/a.html
<filter>
<filter-name>testFilter</filter-name>
<filter-class>cn.lzm.servlet.TestFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>testFilter</filter-name>
<url-pattern>/test/a.html</url-pattern>
</filter-mapping>