1. 程式人生 > >關於AJAX/GET請求亂碼的問題

關於AJAX/GET請求亂碼的問題

     AJAX的GET請求引數中若存在中文等非“ASCII字元”時,服務端在解析請求引數時,如果僅通過request.getParameter(引數key)方法獲取引數值,而不進行相關處理,獲得值中就會出現亂碼的問題。如以下請求:

  •   GET請求時
	param["taskName"] = "任務1";	
	$.ajax({ 
		url : nfmTools.remoteAddress + "doGET", 
		data : param,
		cache : false, 
		async : false, 
		type : 'GET', 
		dataType : 'json', 
		success : function(rsp) 
		{
		});
	@RequestMapping(value = "doGET", method = RequestMethod.GET)
	@ResponseBody
	public void doGet(HttpServletRequest request){
		String name = request.getParameter("taskName");
		System.out.println(name);
	}


  • POST請求時
	param["taskName"] = "任務1";	
	$.ajax({ 
		url : nfmTools.remoteAddress + "doGET", 
		data : param,
		cache : false, 
		async : false, 
		type : 'POST', 
		dataType : 'json', 
		success : function(rsp) 
		{
		});
	@RequestMapping(value = "doPost", method = RequestMethod.POST)
	@ResponseBody
	public void doPost(HttpServletRequest request){
		String name = request.getParameter("taskName");
		System.out.println(name);
	}



     從上面的示例可以看到:傳送get請求時,引數taskName的值是“任務1”,但是java程式碼中獲取的值確實亂碼,而傳送post請求時,則不存在亂碼的問題,為什麼會出現這種情況呢?

      因為: 

      (1) 使用GET方法時,查詢字串(鍵值對)被附加在URL地址後面一起傳送到伺服器,如/test/demo.jsp?name1=value1&name2=value2,而在url中的字元只能是ASCII碼,對於非ASCII碼的字元,將無法表示,所以就會出現亂碼。

      (2)  使用POST方法時,查詢字串在POST請求的Header中存在,和HTTP請求一起傳送到伺服器,沒有隻能是ASCII碼的限制。

瞭解了HTTP GET請求和POST請求的區別之後,如何解決GET請求是的亂碼問題呢?

       方法一、客戶端不做處理,服務端轉碼                 

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

       方法二、客戶端進行encodeURI轉碼,服務端解碼

          js:

	 var param = {};
     var name = "任務1";
     param["name"] = encodeURI(name);
     $.ajax({ 
    	 url : remoteURL, 
    	 data : param,
    	 cache : false, 
    	 async : false, 
    	 type : 'GET', 
    	 dataType : 'json', 
    	 success : function(rsp) 
    	 {
    		 
    	 });

          java:

    public boolean doGET(HttpServletRequest request){
    	String name = request.getParameter("name");
    	System.out.println(name);
    	name = URLDecoder.decode(name, "UTF-8");
    	System.out.println(name);
    }
         列印結果為:
    %E4%BB%BB%E5%8A%A11
    任務1

     方法三、客戶端進行encodeURIComponent轉碼,服務端解碼
          js:
	 var param = {};
     var name = "任務1";
     param["name"] = encodeURIComponent(name);
     $.ajax({ 
    	 url : remoteURL, 
    	 data : param,
    	 cache : false, 
    	 async : false, 
    	 type : 'GET', 
    	 dataType : 'json', 
    	 success : function(rsp) 
    	 {
    		 
    	 });
          java:
    public boolean doGET(HttpServletRequest request){
    	String name = request.getParameter("name");
    	System.out.println(name);
    	name = URLDecoder.decode(name, "UTF-8");
    	System.out.println(name);
    }