Java Web的编解码总结
一、Java Web编解码的场景
1.浏览器发送Http Request到服务器,浏览器对Request编码;
2.服务器接收Http Request,对Request解码;
3.服务器发送Http Response,对Response编码;
4.浏览器接收Http Response,对Response解码;

二、编解码的内容
浏览器对Http Request进行编码,其是对URL、表单参数、Cookie进行编码,具体如下:
1.URL编码,分为URI和QueryString编码,如:http://localhost:8080/中国?name=中国,chrome浏览器对其编码为http://localhost:8080/%E4%B8%AD%E5%9B%BD%E4%B8%AD%E5%9B%BD”;

2.表单参数编码,form中参数;
3.Cookie编码,存放在Header中,使用较少;
三、URL编解码
1.编码
URL编码,是由浏览器对URI和QueryString进行编码。URL具体采用何种编码方式是由浏览器决定的,不同浏览器采用不同的编码方式,同时对URI和QueryString也采用不同的编码方式,如ie对URI使用UTF-8编码,对QueryString使用gbk编码;Firefox对URI和QueryString都是用UTF-8编码。
URL编码方式不受服务器端设置影响。
以GET方式发送的Http Request,其参数是以QueryString形式发送给服务器。
2.解码
服务器接收Http Request对URL解码,是由服务器自身决定,不同服务器采用不同的解码方式,如:
(1) tomcat服务器,文件是server.xml
<Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000" redirectPort="8443" URIEncoding="GBK"/>
URIEncoding告诉服务器servlet解码URL时采用的编码。
<Connector port="8080" ... useBodyEncodingForURI="true" /> useBodyEncodingForURI 告诉服务器解码URL时候需要采用Request Body指定的编码。
(2) weblogic服务器 ,文件是weblogic.xml
<input-charset>
<java-charset-name>GBK</java-charset-name>
</input-charset>
四、表单参数编解码
1.编码
表单参数编码,是以POST方式提交,表单中的参数值对是通过Request Body发送给服务器,此时浏览器会根据网页的ContentType指定的编码进行对表单中的数据进行编码,然后发给服务器。
这里需要注意的是:这里所说的ContentType是指http报文头的ContentType,而不是在网页中meta中的ContentType,meta中指的是浏览器以何种字符集解码来展示网页。
2.解码
服务器接收Request后,使用与之对应的方式解码就可以,具体方式参见下面实现方式。
五、推荐使用方式
1.浏览器发送Http Request编码
1)URI和QueryString中不推荐直接使用中文等非ASCII字符,由于各个浏览器编码方式不统一,服务器端解码问题较大,如果URI和QueryString中包含中文等非ASCII字符,先使用URLEncoder对中文进行编码,如:
<a href="${pageContext.request.contextPath}/servlet/RequestDemo05?userName=gacl&name=<%=URLEncoder.encode("徐达沛", "UTF-8")%>">点击</a>
2)表单参数编码,是由ContentType("text/html; charset=UTF-8")指定;
2.服务器接收Http Request解码
1)URI和QueryString解码,服务器接收后会采用默认或已设置的字符集先进行解码,如:
request.getParameter("name"); // 获得queryString的参数值,其值已经过服务器URL解码过;
request.getPathInfo(); // 注意:pathinfo返回的字符串是经过服务器URL解码过;
requestURI = request.getRequestURI(); // 内容为:contextPath/servletPath/pathinfo 浏览器提交过来的原始数据,未被服务器URL解码过。
所以,对于URI和QueryString的服务器端解码,或根据浏览器端的编码方式,配置服务器解码方式(在XML文件中),或者根据服务器端默认解码方式,将其还原为原始byte数据,再对其进行编码,如:
new String(name.getBytes("ISO8859-1"), "UTF-8") ;//获取request对象以默认ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。
2)表单参数解码,使用request.setCharacterEncoding("UTF-8")设置服务器端对Request Body的解码方式,该方式对GET提交的QueryString不起作用。
3.服务器发送Http Response编码
使用response.setCharacterEncoding("UTF-8")来设置将字符以"UTF-8"编码输出到客户端浏览器。
4.浏览器接收Http Response解码
在服务器端使用response.setHeader("content-type", "text/html;charset=UTF-8"),通过设置响应头控制浏览器以UTF-8解码显示数据。
浙公网安备 33010602011771号