dwr 请求中文乱码问题

鉴客 发布于 2011/11/08 17:34
阅读 1K+
收藏 0

用grinder脚本模拟dwr请求,如果参数有中文,则response返回为乱码;如果把参数encode一下,返回还是为乱码。

这个问题着实纠结了我一些时间。后来发现,原来浏览器实际运行的时候,dwr的engine.js文件中,先给string类型的参数Value作了一次encode操作,代码片段如下:

  switch (typeof data) {
  case "boolean":
    batch.map[name] = "boolean:" + data;
    break;
  case "number":
    batch.map[name] = "number:" + data;
    break;
  case "string":
    batch.map[name] = "string:" + encodeURIComponent(data);
    break;

然后,给参数的Key和Value又作了一次encode,代码片段如下:

    for (prop in batch.map) {
      if (typeof batch.map[prop] != "function") {
        request.url += encodeURIComponent(prop) + "=" + encodeURIComponent(batch.map[prop]) + "&";
      }
    }

这样,其实参数的value值是作了两次encode操作。

果然,如果grinder脚本中,如果首先把参数值URLEncoder.encode()两次后,返回就正常了。

具体dwr服务器端是怎么处理的,没有仔细看。

 

不过这里还遗留两个问题,待查:

第一、dwr之所以两次encode,肯定是出于防止乱码的考虑,为什么?

第二、grinder的httpclient,应该也会对url作encode处理,那么,中文部分加起来就是三次encode了,这个有待进一步验证。

两个遗留问题已经解决:

第一、在web container中,parse参数的时候,会进行一次decode,这样,在request.getParameter()函数被调用的时候,出来的参数已经被decode一次了。假设客户端只encode一次,那么,在服务器端request.getParameter()得到的信息已经没有经过任何编码了,但是由于客户端可以设置各种charset,服务器端用的是utf-8,所以可能会出现乱码。如果encode两次,js的 encodeURIComponent函数能自动encode成utf-8类型。这样,服务器request.getParameter()得到信息后,再把信息按照utf-8解码,就不会出现乱码。

 第二、跟了一下grinder,发现在grinder的处理中,GET的参数都需要经过encode;POST请求的参数,如果参数为 formData的类型,formData需要经过encode,如果参数是byte[]类型的,则不需要进行encode,所以,从grinder的 httpclient发送的请求,参数没有经过额外的encode。

加载中
返回顶部
顶部