一、Filter介绍:
称之为过滤器。web开发人员通过Filter技术,对web服务器管理所有的web资源:例如jsp,静态文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感信息、压缩信息等高级功能。
Servlet API中提供了一个Filter接口,如果编写的java类实现了这个接口,则把这个java类称之为过滤器Filter。Filter源码:
public abstract interface Filter{
//初始化方法
public abstract void init(FilterConfig paramFilterConfig) throws ServletException;
//执行操作
public abstract void doFilter(ServletRequest paramServletRequest, ServletResponse
paramServletResponse, FilterChain paramFilterChain) throws IOException,ServletException;
//销毁方法
public abstract void destroy();
}
二、Filter工作原理
Filter接口中有一个doFilter方法,当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:
调用目标资源之前,让一段代码执行。
是否调用目标资源(即是否让用户访问web资源)。
调用目标资源之后,让一段代码执行。
web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资源的service方法,即web资源就会被访问,否则web资源不会被访问。
三、Filter开发步骤
1.编写java类实现Filter接口,并实现其doFilter方法
2.在web.xml中使用<Filter>和<Filter-mapping>
元素对Filter进行注册,并设置它所能拦截的资源。
过滤器示例:
public class FilterTest implements Filter{
public void init(FilterConfig params){
//Filter初始化
}
public void destory(){
//Filter销毁
}
public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws IOException, ServletException {
// 对request、response进行一些预处理
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
System.out.println("----调用service之前执行一段代码----");
filterChain.doFilter(request, response); // 执行目标资源,放行
System.out.println("----调用service之后执行一段代码----");
}
web.xml中配置过滤器
<filter>
<filter-name>FilterTest</filter-name>
<filter-class>FilterTest的全类名</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterTest</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
四、Filter链
在一个web应用中,可以编写多个Filter,这些Filter组合起来称之为Filter链。web服务器会根据在web.xml中注册顺序决定调用先后顺序。
五、Spring框架中,过滤器的配置
在spring过滤器中,有很多过滤器是不用自己写的,已经给提供好了的,比如:字符编码的过滤器。
CharcterEncodingFilter,配置过滤器
<filter>
<filter-name>CharcterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true<param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharcterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>