Filter的学习(一)

Filter人们称它有过滤器,主要是用来对jsp,servlet,静态图片或者html进行拦截,从而实现一些特殊的功能。比如字符编码登录限制过滤敏感词汇文件压缩跨域设置

Filter开发入门

容我 以一个简单的例子来解释下:字符编码拦截
1、编写java类实现Filter接口,并实现其doFilter方法。
2、在 web.xml 文件中使用元素对编写的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
    com.exam.filter.CharacterFilter
    
      charaterEncode
      utf-8
    
  
  
    filter
    /*
  

继承Filter接口,实现其方法。看到这上面的实现的方法,我们就不得不从Filter的生命周期开始说起,

Filter的生命周期

Filter的创建和销毁由WEB服务器负责。 web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作,filter对象只会创建一次,init方法也只会执行一次。通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
所以,当我们启动web服务器的时候,实现Filter的过滤器类就会执行init函数。

FilterConfig接口

用户在配置filter时,可以使用为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
    com.exam.filter.CharacterFilter
    
      charaterEncode
      utf-8
    
  
  
    filter
    /*
  

然后在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");
        
    }

}

你可能感兴趣的:(Filter的学习(一))