科技部的公众问答

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 ... {

privatestaticfinalLoggerLOG=Logger.getLogger(EncodingFilter.class);

protectedStringencoding=null;
protectedFilterConfigconfig;

publicvoiddestroy()...{
//TODOAuto-generatedmethodstub
LOG.info("filterdestroy");
this.config=null;
}


publicvoiddoFilter(ServletRequestarg0,ServletResponsearg1,
FilterChainarg2)
throwsIOException,ServletException...{
//TODOAuto-generatedmethodstub
LOG.info("filterdoFilter");
if(arg0.getCharacterEncoding()==null)...{
Stringencode
=getEncoding();
if(encode!=null)...{
//设置request的编码方式
LOG.info(encode);
HttpServletRequestrequest
=(HttpServletRequest)arg0;
LOG.info(request.getRequestURL());
LOG.info(request.getRequestURI());
arg0.setCharacterEncoding(encode);
}

}

arg2.doFilter(arg0,arg1);
}


publicvoidinit(FilterConfigarg0)throwsServletException...{
//TODOAuto-generatedmethodstub
LOG.info("filterinit");
this.config=arg0;
this.encoding=arg0.getInitParameter("Encoding");
}


publicStringgetEncoding()...{
returnencoding;
}


}

以上代码比较简单,在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过程发生。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值