您的位置:首页 > 运维架构 > Tomcat

Tomcat中用Filter解决JSP提交中文信息到Servlet的乱码问题

2008-06-20 18:30 791 查看
JSP或者是HTML提交中文信息到Servlet会出现乱码一直是困扰初学者的一大问题,网上关于这个问题的处理方法颇多,最简单的方法莫过于在每个Servlet里添加下面的一句话:
request.setCharacterEncoding(“GBK”);
不过简单的方面未必不麻烦,这需要我们在每个Servlet里都加入这句话,工作量太大。所以为了减轻大家的工作量,有人提出使用Filter来解决这个问题,代码如下:
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {

req.setCharacterEncoding("GBK");

chain.doFilter(req, res);
}
这样就不用在每个Servlet里都加入刚才那就句话了,省去了很多麻烦。当然要求我们在写JSP的时候要设置正确的字符集,这个在课堂上已经讲了很多次了,相信大家已经掌握。
不过,这种方法对使用GET方式提交的FORM并不适用,问题依旧,所以建议不要使用GET方式提交中文信息。不过有的同学说,就喜欢用GET方式或者URL传中文,那怎么解决呢?可以修改Tomcat的配置,这个在网上很容易找到。不过我不太喜欢修改Tomcat的原有配置,因为它对所有的项目都起作用,网站管理员未必总是听我的!所以我尝试了一下,弄出来一个方案,旨在抛砖引玉,希望大家积极讨论。
源码如下

package filters;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 编码过滤器类
* 解决从HTML或JSP向Servlet传递中文信息的乱码问题。
*
* @author coombe
*/
public class CharsetFilter implements Filter {
/** 保存用户指定编码 */
protected String encoding = null;

/**
* 初始化过滤器方法,由系统创建Filter时自动调用
* 把web.xml中用户指定的编码保存在本类的属性中
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.encoding = filterConfig.getInitParameter("encoding");
}
/**
* 执行过滤功能
* 将参数信息按指定的编码进行转换
*/
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
Map parameterMap = req.getParameterMap();
if (!parameterMap.isEmpty()) {
Iterator it = parameterMap.keySet().iterator();
String value[] = null;
while (it.hasNext()) {
value = (String[]) parameterMap.get(it.next());
for (int i = 0; i < value.length; i++) {
value[i] = new String(value[i].getBytes("ISO-8859-1"),
encoding);
}
}
}
chain.doFilter(req, res);
}
/**
* 销毁方法,在系统销毁Filter之前由系统自动调用
*/
public void destroy() {
this.encoding = null;
}
}


并且需要在项目的web.xml里加入下面的配置:
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>filters.CharsetFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

我简单试验了一下,GET、POST或URL传值中文都没有问题,现拿出来与大家分享,不妥之处欢迎批评指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: