看了好多篇文章,最終仍是看到一篇,解決了本身的問題.
ajaxpost.js
var myRequest; // Variable to hold request object
function mysubmit() ...{ if (window.XMLHttpRequest) ...{ myRequest = new XMLHttpRequest(); // Standards-compliant browsers } else if (window.ActiveXObject) ...{ myRequest = new ActiveXObject("Msxml2.XMLHTTP"); // For IE } var post="name="+document.getElementById("postval").value; post=encodeURI(post); post=encodeURI(post); //最重要的部分,兩次調用encodeURI ,就是編碼兩次 myRequest.open("POST","servlet/Display",false); //myRequest.setRequestHeader("contentLength",post.length); myRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); myRequest.send(post); var res=myRequest.responseText;//接收返回的數據 document.getElementById("display").innerHTML=res; } servlet
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException ...{ response.setContentType("text/html"); response.setCharacterEncoding("GBK"); PrintWriter out = response.getWriter(); String name=request.getParameter("name"); name=URLDecoder.decode(name,"utf8"); //post 傳遞的時候,必定是用utf8編碼的,url 本身能夠設定 System.out.println(name); out.println(name); out.flush(); out.close(); } 分析:當調用request.getParameter()函數時,會自動進行一次URI的解碼過程,調用時內置的解碼過程會致使亂碼出現。而URI 編碼兩次後,request.getParameter()函數獲得的是原信息URI編碼一次的內容。再用可控的解碼函數 java.net.URLDecoder.decode()就可解出原始的正確的信息。 |
方法三(還能夠)javascript
AJAX提交數據亂碼,返回數據亂碼的解決方案
隨着AJAX的流行,亂碼問題也開始困擾着許多剛開始使用它的程序員,幸虧我以前對JSP亂碼有過一點研究,在遇到AJAX後,並無給我帶來多大的困擾,在此將個人一些心得共享給你們。
萬變不離其宗,AJAX的亂碼問題天然跟編碼有關了,其實不少人跟我同樣想到了對文件編碼進行設置,而且在接數據時設置了requet的編碼,在返回的數據時設置了response的編碼一切都覺得會很順利,但是這一切都是徒勞無功的,討厭的亂碼再一次出如今你眼前。在你試了N多種方法,包括JS自身的escape,unescape方法後,你發現亂碼仍然猖狂地出如今屏幕上。
其實在試過這N多方法後,不少人都沒發現,解決的方法其實很簡單,並且其答案就在咱們以前處理的JSP亂碼之中。讓咱們先看一下AJAX的經典請求代碼
最後別忘了在返回數據時也設置上: html
經過前面的說明,不知道你如今看出端倪了沒有。不知道是受了網上教程的影響仍是其它方面影響,setRequestHeader並是萬年不變的,也沒人想過去改它,而問題就正好出在這個地方。回想一個JSP頁面內容的編碼設置,其中有這麼一節: java
如今知道問題了吧,因此咱們要把第二句代碼改成: 程序員
是否是很簡單,一點都不麻煩呢?
若是要問爲何的話,其實咱們能夠把xmlhttp當作是一個臨時頁面,它由瀏覽器動態生成,主要做用是在後臺得到請求的數據(能夠當作是一個高級的iframe)。因此對於普通頁面設置的編碼,對它也要一樣設置。而在servlet中返回數據爲何要設置contentType和encoding其道理也是同樣的。衆所周知,jsp的最後形態就是servlet,而jsp頁首設置的那個內容其實也就是讓生成的servlet中生成這麼兩句話:
ajax
而pageEncoding則是跟jvm說明了這個頁面的內容要使用什麼編碼保存(這跟以後生成的CLASS有關係)。因此在servlet設置response的編碼也是理所固然的了。瀏覽器
方法四(很保險,但代碼量很大,是個不錯的選擇.)服務器
在發送ajax請求以前,對參數escape()兩次( 例:name=escape(escape("張三")); ),而後再發送請求到服務器,服務器接收參數後,對參數unescape(),就能夠獲得正確的參數( 例:String name=unescape(request.getParameter("name")); ).cookie
附java版的unescape實現併發
附:prototype ajax亂碼解決方法(已通過測試可行)
prototype對傳遞的參數都進行了編碼轉換工做,每一個傳遞值經過encodeURIComponent 進行了處理.編碼會被轉換成utf-8,在後臺獲取request時,應該統一使用request.setCharacterEncoding("UTF-8")對request設置編碼,而沒必要管頁面的編碼格式是什麼.若是使用post方法進行傳遞數據,則會自動執行:
request.setHeader('Content-type','application/x-www-form-urlencoded').確保傳遞數據編碼格式的正確. app