`
yinzhangheng
  • 浏览: 11104 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

关于get请求乱码而post方式不会乱码详解

 
阅读更多

1.post请求为什么不会乱码?

jsp页面有pageEncoding="UTF-8",进行编码设置,服务端web.xml中有过滤器

org.springframework.web.filter.CharacterEncodingFilter进行request.setCharacterEncoding("utf-8")操作,

故在服务端获取的参数不会乱码。

 

2.get请求为什么会乱码?

get请求参数是通过URL传递的,浏览器默认的会对中文进行gbk编码(URL中如果含有中文等非ASCII字符,则浏览器会对它们进行URLEncode),

而且tomcat默认会对url进行ISO-8859-1编码(可通过修改server.xml设置

修改tomcat的配置文件server.xml:

<Connector URIEncoding="UTF-8" 

 port="8080"   maxHttpHeaderSize="8192"

maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

connectionTimeout="20000" disableUploadTimeout="true" />),

request.setCharacterEncoding("utf-8")设置的编码格式对url参数是不起作用的,

pageEncoding="UTF-8"对url传递也是不起作用的,wel.xml中的org.springframework.web.filter.CharacterEncodingFilter

过滤器实际则是request.setCharacterEncoding("utf-8")操作,也不起作用,故在服务端获取参数会出现乱码。

服务器端通过request.getParameter()解码查询参数(通常是iso-8859-1)

可通过先获取参数的ISO-8859-1字节,在根据gbk解码可获取参数,即:

String param = new String(urlParam.getBytes("ISO-8859-1"),"gbk"),(urlParam则是url传递的参数)

 

3.日常的工作中我们经常使用两次调用encodeURI来解决乱码问题,这是为什么?

encodeURL函数主要是来对URI来做转码,它默认是采用的UTF-8的编码,

UTF-8编码的格式:一个汉字来三个字节构成,每一个字节会转换成16进制的编码,同时添加上%号.

假设页面端输入的中文是一个“中”,按照下面步骤进行解码,

第一次encodeURI,按照utf-8方式获取字节数组变成[-28,-72-83],

对字节码数组进行遍历,把每个字节转化成对应的16进制数,

这样就变成了[E4,B8,AD],最后变成[%E4,%B8,%AD]  此时已经没有了多字节字符,全部是单字节字符。

第二次encodeURI,进行编码,会把%看成一个转义字符,

并不编码%以后字符,会把%编码成%25.把数组最后变成[%25E4,%25B8,%25AD]

然后就把处理后的数据[%25E4,%25B8,%25AD]发往服务器端

当应用服务器调用getParameter方法,getParameter方法会去向应用服务器请求参数

应用服务器最初获得的就是发送来的[%25E4,%25B8,%25AD],

应用服务器会对这个数据进行URLdecode(服务器端通过request.getParameter()解码查询参数(通常是iso-8859-1)操作,应用服务器进行解码的这一次,

不管是按照UTF-8,还是GBK,还是ISO-8859,,都能得到[%E4,%B8,%AD],

因为都会把%25解析成%.并把这个值返回给getParameter方法,

再用UTF-8解码一次,就得到"中"了。

(如果不编码两次,当服务器自动解码的时候,假如是按照ISO-8859去解码UTF-8编码的东西,就是会出现乱码)。

 

4.为什么request.setCharacterEncoding("utf-8"),只会对post方式有作用?

下回分解

 

5.工作中应该如何更好的避免get请求中文乱码?

下回分解

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics