場景:頁面中查詢條件是帶入了中文,操作成功后,重定向到另外一個頁面,重定向的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
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