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

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传值中文都没有问题,现拿出来与大家分享,不妥之处欢迎批评指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值