Java Web應用請求參數編碼

來源:互聯網
上載者:User

標籤:

我們知道,當拼字要跳轉的url中含有中文時,一般地需要轉碼處理,才能到伺服器端正確的接收並處理,這是用戶端與伺服器端通訊時對資料格式的規約。

一般地,使用encodeURIComponent或者encodeURI來處理中文參數(這兩者的區別,以及和escape的區別後面再說),編碼後,在用戶端,成為ISO-8859-1資料格式,一般表現在URL上為%XX這種形式的。

var url = "hello.do?person=" + encodeURIComponent("小明");window.location.href = url;

“小明”經過encodeURIComponent後變成"%E5%B0%8F%E6%98%8E"。

>> encodeURIComponent("小明") "%E5%B0%8F%E6%98%8E" >> encodeURIComponent("中國") "%E4%B8%AD%E5%9B%BD" >> encodeURIComponent("abc/def") "abc%2Fdef" 
>> encodeURIComponent("abc/def+-*/[email protected]#$%^&*(){}[]\|;‘:,./<>?\"")
"abc%2Fdef%2B-*%2F345!%40%23%24%25%5E%26*()%7B%7D%5B%5D%7C%3B‘%3A%2C.%2F%3C%3E%3F%22"

 

到伺服器後,伺服器端接收請求參數,然後進行相應處理。

不同的中介軟體,對於HTTP請求參數的處理不同,一般負責接收參數值,並傳遞給應用伺服器(在應用程式請求參數值時)。

為了處理不同情形以及內部處理的方便,最開始接收與最終傳遞到應用伺服器之間,中介軟體可能做了一些處理,比如編碼成特定格式等。

在Java中,通常用getParameter擷取用戶端傳遞的參數(ajax與跳轉的區別,以及與getAttribute的區別,getAttribute是伺服器與伺服器內部之間的資料傳遞),通常的形式為:

String person = request.getParameter("persion");

那麼,這樣擷取,編碼因素都考慮進去了麼,實際上,如果沒有指定使用中介軟體的HTTP請求編碼格式,會採用相應中介軟體的預設HTTP請求編碼格式。對GET方式和POST方式的請求,設定HTTP請求編碼格式的方式是不一樣的。

按我個人理解,中介軟體HTTP預設請求編碼,指的是它預設以什麼編碼方式識別從用戶端傳遞來的資料。

對於POST方式,一般地,在擷取所有請求參數之前,調用request.setCharacterEncoding("ISO-8859-1")即可指定post內容編碼格式,然後再根據後面需要,轉換成需要的編碼格式的串。

request.setCharacterEncoding("ISO-8859-1");String person = request.getParameter("person");person = new String(person.getBytes("ISO-8859-1"), "UTF-8");

對於GET方式,

tomcat預設接收HTTP請求參數編碼格式就是ISO-8859-1,當然也可以在設定檔中修改成其他,位置為:server.xml檔案中,相應的連接埠的Connector的屬性:URIEncoding=UTF-8(一般不這樣修改,如果本來就是需要接收為ISO-8859-1,在代碼中統一處理編碼)

 <Connector port="8080" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75" URIEncoding=UTF-8
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />

jetty預設接收HTTP請求參數編碼格式是UTF8,一般在JVM啟動參數中配置,形如:

 -Dorg.mortbay.util.URI.charset=iso8859-1

GET方式下實際請求參數,代碼如下:

String person = request.getParameter("person");person = new String(person.getBytes("ISO-8859-1"), "UTF-8");

 

Java Web應用請求參數編碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.