标签:
我们知道,当拼写要跳转的url中含有中文时,一般地需要转码处理,才能到服务器端正确的接收并处理,这是客户端与服务器端通讯时对数据格式的规约。
一般地,使用encodeURIComponent或者encodeURI来处理中文参数(这两者的区别,以及和escape的区别后面再说),编码后,在客户端,成为ISO-8859-1数据格式,一般表现在URL上为%XX这种形式的。
var url = "hello.do?person=" + encodeURIComponent("小明"); window.location.href = url;
“小明”经过encodeURIComponent后变成"%E5%B0%8F%E6%98%8E"。
>> encodeURIComponent("小明") "%E5%B0%8F%E6%98%8E" >> encodeURIComponent("中国") "%E4%B8%AD%E5%9B%BD" >> encodeURIComponent("abc/def") "abc%2Fdef"
>> encodeURIComponent("abc/def+-*/345!@#$%^&*(){}[]\|;‘:,./<>?\"")
"abc%2Fdef%2B-*%2F345!%40%23%24%25%5E%26*()%7B%7D%5B%5D%7C%3B‘%3A%2C.%2F%3C%3E%3F%22"
到服务器后,服务器端接收请求参数,然后进行相应处理。
不同的中间件,对于HTTP请求参数的处理不同,一般负责接收参数值,并传递给应用服务器(在应用程序请求参数值时)。
为了处理不同情形以及内部处理的方便,最开始接收与最终传递到应用服务器之间,中间件可能做了一些处理,比如编码成特定格式等。
在Java中,通常用getParameter获取客户端传递的参数(ajax与跳转的区别,以及与getAttribute的区别,getAttribute是服务器与服务器内部之间的数据传递),通常的形式为:
String person = request.getParameter("persion");
那么,这样获取,编码因素都考虑进去了么,实际上,如果没有指定使用中间件的HTTP请求编码格式,会采用相应中间件的默认HTTP请求编码格式。对GET方式和POST方式的请求,设置HTTP请求编码格式的方式是不一样的。
按我个人理解,中间件HTTP默认请求编码,指的是它默认以什么编码方式识别从客户端传递来的数据。
对于POST方式,一般地,在获取所有请求参数之前,调用request.setCharacterEncoding("ISO-8859-1")即可指定post内容编码格式,然后再根据后面需要,转换成需要的编码格式的串。
request.setCharacterEncoding("ISO-8859-1"); String person = request.getParameter("person"); person = new String(person.getBytes("ISO-8859-1"), "UTF-8");
对于GET方式,
tomcat默认接收HTTP请求参数编码格式就是ISO-8859-1,当然也可以在配置文件中修改成其他,位置为:server.xml文件中,相应的端口的Connector的属性:URIEncoding=UTF-8(一般不这样修改,如果本来就是需要接收为ISO-8859-1,在代码中统一处理编码)
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75" URIEncoding=UTF-8
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
jetty默认接收HTTP请求参数编码格式是UTF8,一般在JVM启动参数中配置,形如:
-Dorg.mortbay.util.URI.charset=iso8859-1
GET方式下实际请求参数,代码如下:
String person = request.getParameter("person"); person = new String(person.getBytes("ISO-8859-1"), "UTF-8");
标签:
原文地址:http://www.cnblogs.com/laokujinxia/p/4534297.html