Filter人们称它有过滤器,主要是用来对jsp,servlet,静态图片或者html进行拦截,从而实现一些特殊的功能。比如字符编码
,登录限制
,过滤敏感词汇
,文件压缩
,跨域设置
。
Filter开发入门
容我 以一个简单的例子来解释下:字符编码拦截
1、编写java类实现Filter接口,并实现其doFilter方法。
2、在 web.xml 文件中使用<filter>和<filter-mapping>元素对编写的filter类进行注册,并设置它所能拦截的资源。当然也可以通过注解来实现。
public class CharacterFilter implements Filter
{
public CharacterFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
//web容器调用 destroy()进行销毁
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//拦截前的操作
chain.doFilter(req, resp);
//拦截后的操作
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
//初始化函数, 随web启动,执行。只执行一次。
}
}
<filter>
<filter-name>filter</filter-name>
<filter-class>com.exam.filter.CharacterFilter</filter-class>
<init-param>
<param-name>charaterEncode</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
继承Filter接口,实现其方法。看到这上面的实现的方法,我们就不得不从Filter的生命周期开始说起,
Filter的生命周期
Filter的创建和销毁由WEB服务器
负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init
方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。
通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
所以,当我们启动web服务器的时候,实现Filter的过滤器类就会执行init函数。
FilterConfig接口
用户在配置filter时,可以使用<init-param>为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:
String getFilterName():得到filter的名称。
String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext():返回Servlet上下文对象的引用。相当于application,全局唯一
下面就简单阐述下字符编码拦截的实现:
首先,在配置文件的参数上设置 其需要 设置的字符编码,这里设置为utf-8
<filter>
<filter-name>filter</filter-name>
<filter-class>com.exam.filter.CharacterFilter</filter-class>
<init-param>
<param-name>charaterEncode</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
然后在Filter类上 如下操作:
public class CharacterFilter implements Filter {
String encode = "utf-8"; //这里设置默认编码为utf-8
/**
* Default constructor.
*/
public CharacterFilter() {
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
req.setCharacterEncoding(encode);
resp.setCharacterEncoding(encode);
chain.doFilter(req, resp);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
//初始化的时候,从配置文件里面去获取 设置的字符编码,得到string型
encode = fConfig.getInitParameter("charaterEncode");
}
}
网友评论