Java Web中涉及的編譯碼

2021-09-25 02:42:13 字數 2674 閱讀 5610

url的組成部分

以tomcat伺服器為例子,其中port,contextpath在server.xml中配置

servletpath在web應用的web.xml中的中配置,pathinfo 是我們請求的具體的 servlet,querystring 是要傳遞的引數,注意這裡是在瀏覽器裡直接輸入 url 所以是通過 get 方法請求的,如果是 post 方法請求的話,querystring 將通過表單方式提交到伺服器端。

通過瀏覽器的請求過程,我們可知兩個「君山」的編碼結果是不同的:e5 90 9b e5 b1 b1,be fd c9 bd。說明了pathinfo和querystring是由不同的邏輯**處理的。

pathinfo的處理取決於server.xml中的connector標籤中的定義,如果沒有定義,那麼將以預設編碼 iso-8859-1 解析。所以如果有中文 url 時最好把 uriencoding 設定成 utf-8 編碼。

querystring 又如何解析? get 方式 http 請求的 querystring 與 post 方式 http 請求的表單引數都是作為 parameters 儲存,都是通過 request.getparameter 獲取引數值。對它們的解碼是在 request.getparameter 方法第一次被呼叫時進行的。request.getparameter 方法被呼叫時將會呼叫 org.apache.catalina.connector.request 的 parseparameters 方法。這個方法將會對 get 和 post 方式傳遞的引數進行解碼,但是它們的解碼字符集有可能不一樣。post 表單的解碼將在後面介紹,querystring 的解碼字符集要麼是 header 中 contenttype 中定義的 charset 要麼就是預設的 iso-8859-1,要使用 contenttype 中定義的編碼就要設定 connector 的  中的 usebodyencodingforuri 設定為 true。這個配置項的名字有點讓人產生混淆,它並不是對整個 uri 都採用 bodyencoding 進行解碼而僅僅是對 querystring 使用 bodyencoding 解碼,這一點還要特別注意。

所以在我們的應用程式中應該盡量避免在 url 中使用非 ascii 字元,不然很可能會碰到亂碼問題,當然在我們的伺服器端最好設定  中的 uriencoding 和 usebodyencodingforuri 兩個引數。如下圖:

當客戶端發起乙個 http 請求除了上面的 url 外還可能會在 header 中傳遞其它引數如 cookie、redirectpath 等,這些使用者設定的值很可能也會存在編碼問題,tomcat 對它們又是怎麼解碼的呢?

對 header 中的項進行解碼也是在呼叫 request.getheader 是進行的,如果請求的 header 項沒有解碼則呼叫 messagebytes 的 tostring 方法,這個方法將從 byte 到 char 的轉化使用的預設編碼也是 iso-8859-1,而我們也不能設定 header 的其它解碼格式,所以如果你設定 header 中有非 ascii 字元解碼肯定會有亂碼。

我們在新增 header 時也是同樣的道理,不要在 header 中傳遞非 ascii 字元,如果一定要傳遞的話,我們可以先將這些字元用 org.apache.catalina.util.urlencoder 編碼然後再新增到 header 中,這樣在瀏覽器到伺服器的傳遞過程中就不會丟失資訊了,如果我們要訪問這些項時再按照相應的字符集解碼就好了。

通過post表單方式提交的引數,解碼是在第一次呼叫request.getparamter(name)時發生的,通過post表單方式提交的引數與querystring不同,他是通過http body傳遞到服務端的,編碼為header中的content-type,解碼也使用content-type,也可以通過request.setcharsetencoding(charset)設定(必須在第一次呼叫getparamter前)。若沒有指定編碼,將使用系統預設編碼進行編碼,content-type為空,tomcat將使用系統預設編碼進行解碼。

當使用者請求的資源已經成功獲取後,這些內容將通過 response 返回給客戶端瀏覽器,這個過程先要經過編碼再到瀏覽器進行解碼。這個過程的編譯碼字符集可以通過response.setcharacterencoding來設定,它將會覆蓋request.getcharacterencoding的值,並且通過 header 的 content-type 返回客戶端,瀏覽器接受到返回的 socket 流時將通過 content-type 的 charset 來解碼,如果返回的 http header 中 content-type 沒有設定 charset,那麼瀏覽器將使用中的編碼進行解碼。如果也沒有定義的話,那麼瀏覽器將使用預設的編碼來解碼。

關於java web中的解碼與編碼

一.html表單,用get和post提交資訊到servlet 1.這個html標籤裡面的屬性的是告訴瀏覽器的編碼。個人覺得可以這樣理解,你編寫乙個html檔案,然後你在body裡面輸入了中文。這裡的charset的值就是表明html製作使用的語言。那麼當瀏覽器要顯示這個html頁面的時候,就知道這個...

url的編譯碼

好常時間沒有寫部落格了,今天就再寫乙個新學的知識吧。關於url的編譯碼。url解碼 string chinesecode decodeuri string sin else if sin ix else sout char ch return sout url編碼 string chinesecod...

python中各種編譯碼彙總

s1 u9500 u552e s2 u u9500 u552e s3 u9500 u552e s4 u u9500 u552e print s1,s2,s3,s4 print s1.decode unicode escape s2.decode unicode escape s3.decode un...