一个url结构
用户提交一个URL,在这个URL中可能存在中文,因此需要编码,如何对这个URL进行编码?先看一下
java 中 httpServletRequest.getRequestURL() 和 httpServletRequest.getRequestURI()返回的结果:
Http :/ /localhost :8080 /examples/ servlets/ servlet/ 君山? auth=君山
url: Http :/ /localhost :8080 /examples/ servlets/ servlet/ 君山
uri: /examples/ servlets/ servlet/ 君山
scheme : Http
domain : localhost
port: 8080
contextPath: examples
servletPath: servlets/servlet
pathInfo: 君山
queryString: auth=君山
post 对应在Tomcat的<Connector port="8080">中的配置,而 contextPath
在<Context path="/examples"> 中的配置
URI编码问题
有可能 pathInfo 和 queryString 的编码不一样的,不同浏览器对pathInfo的编码也可能不一样。
对URL的URI部分进行解码的字符集是在<Connector URIEncoding="UTF-8">中定义的,如果没有定义,那么默认编码ISO-88591 解析。
queryString编解码问题
get 与post方式的http请求表单参数都是作为Parameters保存的,都通过request.getParameter获取参数。对它们的解码是在request.getParameter方法第一次被调用时进行的。对get和post方式传递的参数进行解码,但它们的解码字符集有可能不一样。queryString 的解码字符集要么是Header中ContentType定义的Charst,要么默认的ISO-88591,要使用ContextType 中定义的编码,就要将connextor的
<Connextor URIEncoding="UTF-8" useBodyEncodingForURI="true"> 中的useBodyEncodingForURI设置为true。这个配置不是对整个URI采用BodyEing进行解码,而仅仅是对queryString 使用BodyEncoding解码。
post编解码
前面提到了POST表单提交的参数的解码是在第一次调用request.getParameter时发生的,POST表单的参数传递与QueryString不同,它是通过HTTP的BODY传递至服务端的,当我们在页面上单击提交按钮时浏览器首先将根据ContentType的Charset编码格式对在表单中填入的参数进行编码,然后提交至服务端,在服务端两样也是用ContentType中的字符集进行解码。
注意,在第一次调用request.getParamter方法之前就设置request.setCharacterEncoding(charset),否则你的POST表单提交上来的数据也可能出现乱码。
- tomcat对request参数的解码流程
1.先根据Header中content-type的charset值(默认情况下,浏览器提交的form表单没有charset信息)
2.根据request.setCharacterEncoding(charset),的值来解码
3.如果都没有,表单提交的数据将会按照系统的默认编码方式解析
- 浏览器对response数据的解码流程
1.response的内容可以通过服务端的response.setCharacterEncoding来设置,它将会覆盖request.getCharacterEncoding的值,并且通过Header的Content-type返回客户端,
2.浏览器接收到返回的Socket流时将通过Content-type的charset来解码
3.如果Heaer没有指定编码,那么浏览器将根据html中
<meta HTTP-equiv="Content-Type" content="text/html; charset=GBK">中的charset来解码
4.如果也没有定义,那么使用默认的编码来解码。
js脚本的编码问题
引入js文件时的编码:
<script src="...xx.js" charset="gbk"></script>
如果script中没有charset,浏览器就会以当前这个页面的字符集解析这个js文件
js异步调用的url编码
处理js中url的编码有两个函数:
1.encodeURI() 编码, 通过 decodeURI() 解码
2. encodeURIComponent() 编码, decodeURIComponent()解码
encodeURIComponent 编码的更彻底,一般用在将一个URL当作一个参数放在别一个URL中
--- 摘自《深入分析java web 技术内幕》