一個url結構html
用戶提交一個URL,在這個URL中可能存在中文,所以須要編碼,如何對這個URL進行編碼?先看一下java
java 中 httpServletRequest.getRequestURL() 和 httpServletRequest.getRequestURI()返回的結果:web
Http :/ /localhost :8080 /examples/ servlets/ servlet/ 君山? auth=君山瀏覽器
url: Http :/ /localhost :8080 /examples/ servlets/ servlet/ 君山tomcat
uri: /examples/ servlets/ servlet/ 君山dom
scheme : Http
domain : localhost
port: 8080
contextPath: examples
servletPath: servlets/servlet
pathInfo: 君山
queryString: auth=君山異步
post 對應在Tomcat的<Connector port="8080">中的配置,而 contextPath函數
在<Context path="/examples"> 中的配置post
URI編碼問題ui
有可能 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表單提交上來的數據也可能出現亂碼。
1.先根據Header中content-type的charset值(默認狀況下,瀏覽器提交的form表單沒有charset信息)
2.根據request.setCharacterEncoding(charset),的值來解碼
3.若是都沒有,表單提交的數據將會按照系統的默認編碼方式解析
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 技術內幕》