1、Filter链
<1>web开发中可以写多个Filter,每个Filter有自己需要过滤的URL,当每个过滤器的URL不相同时,这些过滤器互不相关。
<2>当多个过滤器的URL相同时,这多个过滤器就形成了Filter链,具体过滤的顺序由这多个过滤器在web.xml中的注册顺序而定。
2、Filter的生命周期
<1>Filter的创建:
Filter的创建和销毁由web服务器负责,web应用程序启动时,web服务器会去创建Filter的实例对象,并调用init()方法,为后期的过滤拦截做好准备。Filter对象只会创建一次,init()也只会执行一次,通过init方法的参数可以获得当前Filter配置信息的FilterConfig对象,以便获得一些初始化参数,这一些我们会在接下来单独总结。
<2>Filter的销毁,在Filter的生命周期里。Filter只会被销毁一次,destroy()方法也只会被调用一次。
3、FilterConfig接口
我们在学习Filter的init()方法时,我们知道init()方法会传递一个FilterConfig对象,我们可以通过这个FilterConfig的对象来得到在Filter注册时的一些初始化参数。
初始化参数可以用到什么地方呢?我们在使用Filter时可以能会用到一些特定的参数,比如登录验证中,我们没有登录,既不能去访问成功之后的资源页面(也就是我们前面提到的视频资源等等),也不能去访问其他的页面,这时候我们就可以去定义一个初始化参数,里面包含所有的资源页面,只要不登录,这个参数中的页面都不能去访问,这样做可以减少代码量。
具体可用的方法为:
String getFilterName():得到filter的名称。
String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext():返回Servlet上下文对象的引用。
我们来看一个Filter的web.xml的注册信息:
<filter>
<filter-name>FilterDemo02</filter-name>
<filter-class>me.gacl.web.filter.FilterDemo02</filter-class>
<!--配置FilterDemo02过滤器的初始化参数-->
<init-param>
<description>配置FilterDemo02过滤器的初始化参</description>
<param-name>name</param-name>
<param-value>gacl</param-value>
</init-param>
<init-param>
<description>配置FilterDemo02过滤器的初始化参</description>
<param-name>like</param-name>
<param-value>java</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterDemo02</filter-name>
<!--“/*”表示拦截所有的请求 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
我们看看如何获取这些初始化参数:
package me.gacl.web.filter;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FilterDemo02 implements Filter {
/* 过滤器初始化
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("----过滤器初始化----");
//得到过滤器的名字
String filterName = filterConfig.getFilterName();
//得到在web.xml文件中配置的初始化参数
String initParam1 = filterConfig.getInitParameter("name");
String initParam2 = filterConfig.getInitParameter("like");
//返回过滤器的所有初始化参数的名字的枚举集合。
Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
System.out.println(filterName);
System.out.println(initParam1);
System.out.println(initParam2);
while (initParameterNames.hasMoreElements()) {
String paramName = (String) initParameterNames.nextElement();
System.out.println(paramName);
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("FilterDemo02执行前!!!");
chain.doFilter(request, response); //让目标资源执行,放行
System.out.println("FilterDemo02执行后!!!");
}
@Override
public void destroy() {
System.out.println("----过滤器销毁----");
}
}