JavaWeb学习篇之----Servlet过滤器Filter

原来帖地址:http://blog.csdn.net/jiangwei0910410003/article/details/23372847?locationNum=8
一、Servlet过滤器接口的构成:
所有的Servlet过滤器类都必须实现javax.servlet.Filter接口。这个接口含有3个过滤器类必须实现的方法:
A.init(FilterConfig):
这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数
B.doFilter(ServletRequest,ServletResponse,FilterChain):
这个方法完成实际的过滤操作,当客户请求访问于过滤器关联的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain参数用于访问后续过滤器
C.destroy():
Servlet容器在销毁过滤器实例前调用该方法,这个方法中可以释放Servlet过滤器占用的资源

##############################################################

、Servlet过滤器的创建步骤:

1.实现javax.servlet.Filter接口
2.实现init方法,读取过滤器的初始化函数
3.实现doFilter方法,完成对请求或过滤的响应
4.调用FilterChain接口对象的doFilter方法,向后续的过滤器传递请求或响应

5.销毁过滤器

####################################################################

三、Servlet过滤器对请求的过滤:
1.Servlet容器创建一个过滤器实例
2.过滤器实例调用init方法,读取过滤器的初始化参数
3.过滤器实例调用doFilter方法,根据初始化参数的值判断该请求是否合法
4.如果该请求不合法则阻塞该请求
5.如果该请求合法则调用chain.doFilter方法将该请求向后续传递
##########################################################
四、Servlet过滤器对响应的过滤:
1.过滤器截获客户端的请求
2.重新封装ServletResponse,在封装后的ServletResponse中提供用户自定义的输出流
3.将请求向后续传递
4.Web组件产生响应
5.从封装后的ServletResponse中获取用户自定义的输出流
6.将响应内容通过用户自定义的输出流写入到缓冲流中
7.在缓冲流中修改响应的内容后清空缓冲流,输出响应内容
##########################################################
五、Servlet过滤器的发布:
A.发布Servlet过滤器时,必须在web.xml文件中加入元素和元素。
B.元素用来定义一个过滤器:
属性                   含义
filter-name    指定过滤器的名字
filter-class    指定过滤器的类名
init-param    为过滤器实例提供初始化参数,可以有多个
C.元素用于将过滤器和URL关联:
属性                     含义
filter-name    指定过滤器的名字
url-pattern    指定和过滤器关联的URL,为”/*”表示所有URL
***************************************************************************************

首先来看一下web.xml的配置:

    
        
        logfilter    
        com.weijia.filterservlet.LogFilter    
        
        
        logfilter    
        /*    
      
      
    
        
        setCharacterEncoding    
        com.weijia.filterservlet.EncodingFilter    
            
            encoding    
            utf-8    
            
        
        
        setCharacterEncoding    
        /*    
        

然后看一下编码过滤器:

package com.weijia.filterservlet;  
  
import java.io.IOException;  
import java.util.Enumeration;  
import java.util.HashMap;  
  
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 EncodingFilter implements Filter {    
    private String encoding;    
    private HashMap params = new HashMap();    
    // 项目结束时就已经进行销毁    
    public void destroy() {    
        System.out.println("end do the encoding filter!");    
        params=null;    
        encoding=null;    
    }    
    public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {    
        System.out.println("before encoding " + encoding + " filter!");    
        req.setCharacterEncoding(encoding);    
        chain.doFilter(req, resp);          
        System.out.println("after encoding " + encoding + " filter!");    
        System.err.println("----------------------------------------");    
    }    
     
    // 项目启动时就已经进行读取    
    public void init(FilterConfig config) throws ServletException {    
        System.out.println("begin do the encoding filter!");    
        encoding = config.getInitParameter("encoding");    
        for (Enumeration e = config.getInitParameterNames(); e.hasMoreElements();) {    
            String name = (String) e.nextElement();    
            String value = config.getInitParameter(name);    
            params.put(name, value);    
        }    
    }    
 }    

日志过滤器:

package com.weijia.filterservlet;  
  
import java.io.IOException;  
  
import javax.servlet.Filter;  
import javax.servlet.FilterChain;  
import javax.servlet.FilterConfig;  
import javax.servlet.ServletException;  
import javax.servlet.ServletRequest;  
import javax.servlet.ServletResponse;  
import javax.servlet.http.HttpServletRequest;  
  
public class LogFilter implements Filter {    
      
    public FilterConfig config;    
     
    public void destroy() {    
        this.config = null;    
        System.out.println("end do the logging filter!");  
    }    
     
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {    
        System.out.println("before the log filter!");    
        // 将请求转换成HttpServletRequest 请求    
        HttpServletRequest hreq = (HttpServletRequest) req;    
        // 记录日志    
        System.out.println("Log Filter已经截获到用户的请求的地址:"+hreq.getServletPath() );    
        try {    
            // Filter 只是链式处理,请求依然转发到目的地址。    
            chain.doFilter(req, res);    
        } catch (Exception e) {    
            e.printStackTrace();    
        }    
        System.out.println("after the log filter!");    
    }    
     
    public void init(FilterConfig config) throws ServletException {    
        System.out.println("begin do the log filter!");    
        this.config = config;    
    }    
     
 }    

访问FilterServlet

运行结果:

before the log filter!
Log Filter已经截获到用户的请求的地址:/FilterServlet
before encoding utf-8 filter!
after encoding utf-8 filter!
----------------------------------------
after the log filter!


我们从运行结果可以看到这个过滤器的调用关系:

JavaWeb学习篇之----Servlet过滤器Filter_第1张图片

以上是我转发 感觉对 拦截器 写的挺透彻的一个内容 有兴趣的朋友可以去 原贴。

你可能感兴趣的:(java)