科技部的公众问答
来源:互联网 发布:教育机构网络宣传 编辑:程序博客网 时间: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;
}
}
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>
<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过程发生。
很少写东西,自己都感觉没说清楚,大致表达个意思吧。
- 科技部的公众问答
- 参与CSDN社区问答活动“基于Java的微信公众平台开发”赢签名赠书
- 参与CSDN社区问答活动“基于Java的微信公众平台开发”赢签名赠书
- 关于金山Office问题给给科技部的公开信
- 科技部留言板
- 微信公众平台开发问答
- [048] 参与CSDN社区问答活动“基于Java的微信公众平台开发”赢签名赠书
- [048] 参与CSDN社区问答活动“基于Java的微信公众平台开发”赢签名赠书
- 有意思的问答
- C#的基础知识问答
- Debian的一句话问答
- 杨峰铭 的 问答
- J2EE的常见问答
- 关于TreeView的问答
- C#的基础知识问答
- BW的一些问答
- C#的基础知识问答
- 好累吖,一天的问答
- 温馨话语2
- 如何编写Linux的LCD驱动
- 25岁董事长给大学生18条忠告
- vc小窍门
- SAP 编年史
- 科技部的公众问答
- linux下rsh的无密码登录配置
- 正则表达式
- TFT、STN和CSTN液晶显示屏区别
- Linux网络编程基础(一)
- 一小段代码,得到项目决对路径
- Linux网络编程基础(二)
- Linux网络编程基础(三)
- OpenSolaris/Solaris中文FAQ