科技部的公众问答

来源:互联网 发布:教育机构网络宣传 编辑:程序博客网 时间:2024/04/30 05:18

filter顾名思义就是过滤器,能够在某些行为之前进行过滤操作,但其中的一些细节问题还是需要通过自己的代码经历来感受通过以下代码的一些调试来说明几个细节问题:

package com.weis.filter;

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;

import common.Logger;

public class EncodingFilter implements Filter {

    
private static final Logger LOG = Logger.getLogger(EncodingFilter.class);

    
protected String encoding = null;
    
protected FilterConfig config;

    
public void destroy() {
        
// TODO Auto-generated method stub
        LOG.info("filter destroy");
        
this.config = null;
    }


    
public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain arg2) 
throws IOException, ServletException {
        
// TODO Auto-generated method stub
        LOG.info("filter doFilter");
        
if (arg0.getCharacterEncoding() == null{
            String encode 
= getEncoding();
            
if (encode != null{
                
// 设置request的编码方式
                LOG.info(encode);
                HttpServletRequest request 
= (HttpServletRequest) arg0;
                LOG.info(request.getRequestURL());
                LOG.info(request.getRequestURI());
                arg0.setCharacterEncoding(encode);
            }

        }

        arg2.doFilter(arg0, arg1);
    }


    
public void init(FilterConfig arg0) throws ServletException {
        
// TODO Auto-generated method stub
        LOG.info("filter init");
        
this.config = arg0;
        
this.encoding = arg0.getInitParameter("Encoding");
    }


    
public String getEncoding() {
        
return encoding;
    }


}

以上代码比较简单,在filter初始化的时候在控制台显示"filter init"信息,destroy的时候在控制台显示"filter destroy"信息,在过滤时关键注意LOG.info(request.getRequestURL());与LOG.info(request.getRequestURI());这两句。Web.xml配置如下:

<filter>
    
<filter-name>encodingFilter</filter-name>
    
<filter-class>com.weis.filter.EncodingFilter</filter-class>
    
<init-param>
        
<param-name>Encoding</param-name>
        
<param-value>UTF-8</param-value>
    
</init-param>
</filter>
<filter-mapping>
    
<filter-name>encodingFilter</filter-name>
    
<url-pattern>/*</url-pattern>
</filter-mapping>

这样表示所有的文件请求都通过此过滤器,所有的请求都包括哪些呢,比如说,jsp页面、CSS文件、图片文件都会先经过此过滤器。

运行TOMCAT之后,以下是执行情况:

1、首先可以看到filter被初始化,出现"filter init"信息,这说明filter的初始化过程是在载入时即产生的;

2、访问该WebApp下的一个页面,发现出现了很多次doFilter的调用,就如上面所说,有jsp页面导致的,有css文件导致的,有图片文件导致的,这样的话中间其实是会产生较多无用的过滤动作,这一点我看了网上的很多文章,以编码过滤器为例,基本上都是匹配的所有请求,即web.xml中<url-pattern>/*</url-pattern>匹配了所有的请求,从上面的代码可以知道,其实很多是不需要进行匹配的;

3、最后,当停止TOMCAT的时候,出现"filter destroy"信息,filter的destroy过程发生。

很少写东西,自己都感觉没说清楚,大致表达个意思吧。

原创粉丝点击