1. 什麼是URL編碼。html
URL編碼是一種瀏覽器用來打包表單輸入的格式,瀏覽器從表單中獲取全部的name和其對應的value,將他們以name/value編碼方式做爲URL的一部分或者分離的發送到服務器上。java
2. URL編碼規則。web
每對name/value由&分開,每對來自表單的name/value用=分開。若是用戶沒有輸入值的那個name依舊會出現不過就是沒有值。瀏覽器
URL編碼是在字符ASCII碼的十六進制數的前面加上%。例如\(她的十六進制數表示爲5c)的URL編碼就是%5c。服務器
3. 簡單介紹亂碼和http請求ide
其實作web開發亂碼問題是常常出現的,有了上面編碼的基礎以後下面來看看亂碼。post
1) 亂碼問題是web開發過程當中常常遇到的問題,主要緣由就是URL中使用了非ASCII碼形成服務器後臺程序解析出現亂碼的問題。編碼
2) URL中最容易出現中文的地方就是在QueryString的參數值還有Servletpath中。spa
3) 簡單用一個圖來講明一下http請求的流程:code
第一步:瀏覽器把URL通過編碼送給服務器;
第二步:服務器把這些請求解碼處理完畢以後將顯示的內容進行編碼發送給客戶端瀏覽器;
第三步:瀏覽器按照指定的編碼顯示網頁
4) 詳細剖析GET提交如何編碼以及服務器如何解碼以及亂碼解決方案
對於GET方式,咱們知道它的提交是將請求數據附加到URL後面做爲參數,這樣依賴亂碼就會很容易出現,由於數據name和value頗有可能就是傳遞的爲非ASCII碼。
當URL拼接後,瀏覽器對其進行encode,而後發送到服務器。具體規則見URL編碼規則。
這裏詳細說一下encode的過程當中容易出現的問題,在這個過程當中咱們要明白鬚要URL encode的字符通常都是非ASCII碼字符,因此咱們就能知道出現亂碼主要是URL中附加了中文或特殊字符作成的,另外一個要知道URL encode究竟是以什麼樣的編碼方式對字符進行編碼的,其實這個編碼方式是由瀏覽器決定的,不一樣的瀏覽器和同一瀏覽器的不一樣設置影響了URL的編碼,因此爲了不咱們不須要的編碼,咱們能夠經過java代碼或javaspcript代碼統一進行控制。
完成了URL encode以後URL就成了ASCII範圍內的字符了,而後就以iso-8859-1的編碼方式轉換爲二進制隨着請求頭一塊兒發送出去。
到了服務器以後,首先服務器會先用iso-8859-1進行解碼,服務器獲取的數據都是ASCII範圍內的請求頭字符,其中請求URL裏面帶有參數數據,若是是中衛或特殊字符,那麼encode後的%XY(編碼規則中的十六進制數)經過request.setCharacterEncoding()是無論用的。這時候咱們就能發現出現亂碼的根本緣由就是客戶端通常是經過用UTF-8或GBK等對數據進行encode的,到了服務器卻用iso-8859-1方式decoder顯然不行。
這裏的解決方式有兩種,
一種:是經過String類的getBytes方法進行編碼轉換,具體java代碼是:
new String(request.getParameter(「name」).getBytes(「iso-8859-1」),「客戶端編碼方式」)
第二種:在服務器xml代碼中改配置信息:
<Connector port="8080"protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"
redirectPort="8443"URIEncoding="客戶端編碼"/>
5) 詳細剖析POST提交如何編碼以及服務器如何解碼以及亂碼解決方案
對於POST方式,表單中的參數值對是經過request包發送給服務器,此時瀏覽器會根據網頁的ContentType("text/html; charset=GBK")中指定的編碼進行對錶單中的數據進行編碼,而後發給服務器。
在服務器端的程序中咱們能夠經過
Request.setCharacterEncoding()設置編碼,而後經過
request.getParameter得到正確的數據。
這裏出現亂碼能夠經過Request.setCharacterEncoding()直接解決。