get請求與post請求的編碼格式


場景:頁面中查詢條件是帶入了中文,操作成功后,重定向到另外一個頁面,重定向的url如下:

后台把這些值傳入后,url會出現亂碼,查詢失敗的場景。

定位原因是:編碼格式的問題,get請求

解決方案:1.在method voidBillManage中返回為null,然后前台用ajax post請求voidBillManage,然后在success中再去請求一次queryBillMange.action

2.在voidBillManage方法中進行一次編碼  URLEncoder.encode(search_BBM_TRAVELLER, "UTF-8");

 https://blog.csdn.net/smuedward/article/details/51755298

 

流程:

內容使用GET方式發送,就會在URL后面帶上內容,在瀏覽器發來的請求經過了瀏覽器的URI編碼,發送到服務器這邊,如果是struts2會經過攔截器進行URI解碼。

這時候想解決中文編碼問題有三種方式

    假設:

    url:http://localhost:8080/test?name=測試

    一、在服務器進行處理

      得到的內容是"iso8859-1",使用

        String str = new String(name.getByte("iso8859-1"),"utf-8");

      得到正確的值。

      ps:這種方式有個缺點;這種方式服務器必須默認使用iso8859-1的方式編碼,如果我在TOMCAT更改默認的iso8859-1為utf-8,那么這種方式就無法生效了。

    二、在TOMCAT配置文件中設置

      在TOMCAT的目錄下conf/server.xml中,搜索"8080"端口,如果改了端口按端口號搜索,搜到之后在這個標簽中空格輸入 URIEncoding="UTF-8" ,它默認是iso8859-1。

      ps:這種方式缺點顯而易見,換了服務器就要更改,有時候忘記也是很常見的事情。

    三、手動編碼多一次

      瀏覽器和服務器傳輸都是先編碼后解碼,對中文的支持不太好,那么能不能把中文事先轉換成英文或數字傳輸呢?

      假設:

        1、name=測試,在JS標簽中,使用encodeURI(param)方法先將“測試” 轉成 name=%26%92(瞎編的)  瀏覽器再自動進行URI編碼 name=%2525%2592(%的URI編碼為%25);

          ognl表達式中,使用<s:param name="name" value="%{@java.net.URLEncoder.encode(name,'utf-8')}"> 對值進行URI編碼,同時在struts2配置文件中開啟靜態方法的支持 java.net.URLEncoder.encode()。

          struts.xml: name="struts.ognl.allowStaticMehtodAccess" value="true"

        2、這時候將這鏈接GET方式提交了

        3、服務器那邊得到 name=%26%92 ,我們再使用URIDecoder.decode(name,"utf-8"); 進行解碼,這樣就得到了“測試”

      PS:這種方式比較好,不依賴TOMCAT

 

1.POSt請求參數編碼處理,如果客戶端沒有在Content-Type標頭中設置字符編碼信息,出現亂碼的原因:容器使用的編碼處理方式和客戶端發送非ASCII字符的請求參數的編碼方式不一樣,比如網頁編碼是UTF-8,使用窗體post發送某個中文字符,瀏覽器會把這個中文方式變為在"UTF-8"編碼下的三個字節的對應十六進制數值表示.(GET是HTTP服務器處理,而POST是WEB容器處理(本例使用的是tomcat9).)
在Servlet中取得請求參數時,容器若默認使用ISO-8859-1來處理編碼(Tomcat 8以后URIEncoding的默認值為UTF-8,8以前為ISO-8859-1,web容器默認的URIEncoding編碼方式只影響GET請求方式,Post默認的還是ISO-8859-1,仍需設置才能解決)
web容器就會把這個中文字符UTF-8編碼的十六進制數值表示按照ISO-8859-1編碼方式處理,最終得到的就是亂碼了.
 
GET請求參數編碼處理:
request.setCharacterEncoding("UTF-8");這個方法對於請求Body中的字符編碼才有作用,也就是基本只對POST產生作用,終究的原因是(GET是HTTP服務器處理,而POST是WEB容器處理(本例使用的是tomcat).)
詳細解說:
https://blog.csdn.net/LPLIFE/article/details/79593316
 

3.3. setCharacterEncoding()

    該函數用來設置http請求或者相應的編碼。

對於request,是指提交內容的編碼,指定后可以通過getParameter()則直接獲得正確的字符串,如果不指定,則默認使用iso8859-1編碼,需要進一步處理。參見下述"表單輸入"。值得注意的是在執行setCharacterEncoding()之前,不能執行任何getParameter()。java doc上說明:This method must be called prior to reading request parameters or reading input using getReader()。而且,該指定只對POST方法有效,對GET方法無效。分析原因,應該是在執行第一個getParameter()的時候,java將會按照編碼分析所有的提交內容,而后續的getParameter()不再進行分析,所以setCharacterEncoding()無效。而對於GET方法提交表單是,提交的內容在URL中,一開始就已經按照編碼分析所有的提交內容,setCharacterEncoding()自然就無效。

    對於response,則是指定輸出內容的編碼,同時,該設置會傳遞給瀏覽器,告訴瀏覽器輸出內容所采用的編碼。

https://www.cnblogs.com/friends-wf/p/3731058.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM