Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
Web容器调用destroy方法销毁Filter。destroy方法在Filter的生命周期中仅执行一次。在destroy方法中,可以释放过滤器使用的资源。
过滤器允许灵活配置,以应对复杂的环境。允许过滤器灵活配置的是FilterConfig接口。
1、FilterConfig接口
用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:
String getFilterName():得到filter的名称。
String getInitParameter(String name):返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContextgetServletContext():返回Servlet上下文对象的引用。
2、JAVA实现利用FilterConfig得到filter配置信息
过滤器的JAVA代码:
package com.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;
/**
*一个简单带过滤器配置的过滤器
*@author 范芳铭
*/
public class EasyFilterConfig implementsFilter {
@Override
publicvoid init(FilterConfig filterConfig) throws ServletException {
System.out.println("----过滤器初始化----");
//得到过滤器的名字
StringfilterName = filterConfig.getFilterName();
//得到在web.xml文件中配置的初始化参数
StringinitParam1 = filterConfig.getInitParameter("name");
StringinitParam2 = filterConfig.getInitParameter("like");
//返回过滤器的所有初始化参数的名字的枚举集合。
Enumeration<String>initParameterNames = filterConfig
.getInitParameterNames();
System.out.println("过滤器名称:" + filterName);
System.out.println("初始参数name:"+ initParam1);
System.out.println("初始参数like:"+ initParam2);
while(initParameterNames.hasMoreElements()) {
StringparamName = (String) initParameterNames.nextElement();
System.out.println("初始参数:" + paramName);
}
}
//过滤器功能在这里实现
@Override
publicvoid doFilter(ServletRequest request, ServletResponse response,
FilterChainchain) throws IOException, ServletException {
//对request和response进行一些预处理
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("###过滤器执行前!!!");
chain.doFilter(request,response); //
让目标资源执行,放行
System.out.println("---过滤器执行后!!!");
}
@Override
publicvoid destroy() {
System.out.println("----过滤器销毁----");
}
}
3、将过滤器添加到Web.xml
<!--配置过滤器 -->
<filter>
<filter-name>easyFilter</filter-name>
<filter-class>com.filter.EasyFilterConfig</filter-class>
<!--配置EasyFilterConfig过滤器的初始化参数-->
<init-param>
<description>配置EasyFilterConfig过滤器的初始化参数</description>
<param-name>name</param-name>
<param-value>ffm</param-value>
</init-param>
<init-param>
<description>配置EasyFilterConfig过滤器的初始化参数</description>
<param-name>2</param-name>
<param-value>java2</param-value>
</init-param>
<init-param>
<description>配置EasyFilterConfig过滤器的初始化参数</description>
<param-name>3</param-name>
<param-value>java3</param-value>
</init-param>
</filter>
<!--映射过滤器 -->
<filter-mapping>
<filter-name>easyFilter</filter-name>
<!--“/*”表示拦截所有的请求-->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
参数说明
<description>用于添加描述信息,该元素的内容可为空,<description>可以不配置。
<filter-name>用于为过滤器指定一个名字,该元素的内容不能为空。
<filter-class>元素用于指定过滤器的完整的限定类名。
<init-param>元素用于为过滤器指定初始化参数,它的子元素<param-name>指定参数的名字,<param-value>指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。如果过滤器不需要指定初始化参数,那么<init-param>元素可以不配置。
4、测试结果
将WEB服务启动起来,这个就自动被加载执行了。
----过滤器初始化----
过滤器名称:easyFilter
初始参数name:ffm
初始参数like:null
初始参数:3
初始参数:2
初始参数:name