jsp&ajax乱码处理-2

      刚才前一篇已经讲了处理乱码的一种方法,我并不想单独用拦截器的方式来处理,那样每一个action就要加一个interceptor,且对每个都要重新转码一次.于是就想从filter入手来解决,让他本身就以utf-8的方式从客户端一直到action.在先前的setCharacterFilter里面,看到这样一个东西.
if(ignore || (request.getCharacterEncoding() == null)) {
	String encoding = selectEncoding(request);
	if(encoding != null) {
		request.setCharacterEncoding(encoding);
	}
}
 这里,得到的encoding默认是GBK,在接下来,if(encoding != null),我想如果将encoding改为null,那就不会执行request.setCharacterEncoding(encoding)了,那就不会出乱码了吧.说改就改,改selectEncoding(request)这个方法.
protected String selectEncoding(ServletRequest request) {
               if(request.getParameter("ajax") != null)
		return null;
               return this.encoding;
}
 编译运行,处理ajax请求,好像通过了.ajax编码终于正确了,运行了一段时间,以为问题就解决了.还没有一会儿,另一个测试的同学来跟我说,jsp又出乱码了,跑过去一看,果然是乱码.好像是post乱码了.用request.getParameter来做,还是乱码.应该是拦截器这儿出问题了,跑到filter里面,对request.getCharacter进行输出,发现在没有改变编码之前,它的默认编码是ISO-8859-1,而改变之后确实是GBK啊.这是怎么回事,我已经将encoding改为GBK了,怎么会没反应.将参数进行一将ISO-8859-1到GBK转换,参数正确了.可这样不行啊,难道是我的selectEncoding有问题,将先前没有改过的方法进行替换,结果又能正确的解析参数了(可惜ajax乱码).
      决定看tomcat源代码,找到这一段中,对request.getParameter进行查询,结果发现这么一段
public String getParameter(String name) {
        if (!parametersParsed)
            parseParameters();

        return coyoteRequest.getParameters().getParameter(name);
}
 return 这一名后面应该是对参数进行map.get方法,那前一句肯定有问题了,转向前一句:
protected void parseParameters() {
        parametersParsed = true;
        Parameters parameters = coyoteRequest.getParameters();
        String enc = getCharacterEncoding();
......
}

 这个访求将parametersParsed置真,那么,如果这个为真的话,那么这个方法就不会被执行,也就是说,再不会进行转码操作.parseParameters只会被进行一次,也就是说,如果我调用了,getParamters这个方法之后,再进行setCharacterEncoding方法,将不会对parseParameters方法有任何影响,因为这个方法已经被执行了,而依据的编码是之前的旧的编码.在上面那个selectEncoding中,我执行了一个request.getParameters()方法,相关的编码已经固定下来了,所以接下来的编码都不会对参数的编码问题有影响.所以,在执行编码设置之前,不能调用任何getParameters()方法,可能还有其他方法(暂时不管其他的).这就难办了.
        忽然想看看,ajax调用之前的编码是什么,结果打印出来结果为UTF-8,而对jsp之前的编码进行打印时,却是null.仔细看了下,doFilter之个方法,还有那个if语句.很简单,如果request.getCharacterEncoding()不为空时,是可以不用再设置编码为GBK了,而当为null时,则可以设置编码.再仔细看了下这个ignore参数,它现在默认是true,也就是说,如果它为true,那都会强制进行设置编码操作,于是一个新的办法出来了.将ignore设置为false,每次设置编码由request来决定,如果编码为null则设置为GBK,否则就按已经设置好的编码(如ajax的UTF-8)进行.
       因此将selectEncoding改回去,原来的不变,然后在web.xml中,对setCharacterEncoding的初始化参数进行修改,将ignore改为false,这样整个问题就解决了.
      事后看了下这个问题,其他也很简单的,就是修改一个ignore参数的问题,然而却费了这么长的时间.原因还是自己对这个问题不太明白,以前看ignore这个参数觉得没什么用嘛,原来在这些问题还发挥了作用,最后还去看源代码,本来很简单的一件事,费这么大功夫,虽然有点不值,还算是买了个念像,以后碰到这个问题应该就不会再出问题了.
Fly_m 记.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值