java三大器之过滤器(Filter)详解

一、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>

猜你喜欢

转载自blog.csdn.net/qq_33628614/article/details/78833784