Java Web的编解码总结

一、Java Web编解码的场景

  1.浏览器发送Http Request到服务器,浏览器对Request编码;

  2.服务器接收Http Request,对Request解码;

  3.服务器发送Http Response,对Response编码;

  4.浏览器接收Http Response,对Response解码;

  image

二、编解码的内容

  浏览器对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”;

  image

  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解码显示数据。

 

posted on 2016-04-14 22:03  KAZMA  阅读(424)  评论(0)    收藏  举报

导航