解决GET提交JSON数据在后端的乱码问题

原创 2016年08月28日 20:01:16

环境:eclipse,Tomcat8,Edge浏览器,Struts2.3,JSP中page encode是utf-8。
问题:前台JS中使用GET把JSON数据提交给后台Action,在Action中把数据打印到控制台,显示乱码。
  下面是前后台的代码:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <script type="text/javascript" src="json2.js">
        </script>
        <script type="text/javascript">
            var myAjaxObject;

            function ajaxTransferText(){
                var BigText = document.getElementById("BigText").value;
                var ajaxTransferObjectRef = new ajaxTransferObject("username", "password", 10, BigText);
                var JSONString = JSON.stringify(ajaxTransferObjectRef);

                if (window.ActiveXObject) {
                    myAjaxObject = new ActiveXObject("Microsoft.XMLHTTP");
                }
                else {
                    myAjaxObject = new XMLHttpRequest();
                }

                var urlString = "jsonString=" + JSONString + "&timestamp=" + new Date().getTime();

                alert(urlString);
                myAjaxObject.open("GET", "getJSON.action?"+urlString, true);

                myAjaxObject.send(null);

            }


            function ajaxTransferObject(username, password, age, BigText){
                this.username = username;
                this.password = password;
                this.age = age;
                this.BigText = BigText;
            }
        </script>
    </head>
    <body>
        <textarea name="textarea" id="BigText" cols="45" rows="5">
        </textarea>
        <br/>
        <input type="button" value="test" onclick="ajaxTransferText()"/>
    </body>
</html>
package controller;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import net.sf.json.JSONObject;

import com.opensymphony.xwork2.ActionSupport;

public class GetJSON extends ActionSupport {

    private String jsonString;

    public String getJsonString() {
        return jsonString;
    }

    public void setJsonString(String jsonString)
            throws UnsupportedEncodingException {
        this.jsonString = new String(jsonString.getBytes("ISO-8859-1"));
    }

    public String execute() {
        System.out.println(jsonString);
        JSONObject json = JSONObject.fromObject(jsonString);
        System.out.println("username=" + json.get("username"));
        System.out.println("username=" + json.get("password"));
        System.out.println("username=" + json.get("age"));
        System.out.println("username=" + json.get("BigText"));

        return null;

    }
}

在这里首先尝试用UTF-8进行编码,this.jsonString = new String(jsonString.getBytes(“ISO-8859-1”) ,”UTF-8”);但是并没有起到作用。
然后尝试在Tomcat的Server.xml中添加URIEncoding=”UTF-8” ,同样无效。
最终解决方法是在JS中两次编码,并在JAVA中两次解码。

myAjaxObject.open("GET","getJSON.action?"+encodeURI(encodeURI(urlString)),true);
    public void setJsonString(String jsonString) throws UnsupportedEncodingException {

        this.jsonString = URLDecoder.decode(jsonString,"UTF-8");
        this.jsonString = URLDecoder.decode(this.jsonString,"UTF-8");
    }

具体原理参考了《深入分析Java Web技术内幕》一书中关于Java与JS编码问题的说明。
JS端有encodeURI()和encodeURIComponent()方法,可以把URL中的字符进行UTF-8编码,每个码值前加上”%”。编码范围encodeURIComponent()>encodeURI()
Java端处理URL编码有两个类,分别是URLEncoder和URLDecoder。这两个类可以将使用”%”加UTF-8编码的字符用UTF-8解码。但是这两个方法编码范围要小于JS端的方法。所以可以通过JS中两次编码,并在JAVA中两次解码解决。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android网络编程之使用get方式向服务端提交数据和乱码问题的解决

学习javaweb的时候都知道向服务端提交数据有两种方式,get和post。今天学习了在Android客户端使用get方式提交登录数据的小案例。 步骤:先新建一个web项目,搭建一个简单的登录表单界面...

java中form以post、get方式提交数据中文乱码问题总结

一:form在前台以post方式提交数据:     浏览器将数据(假设为“中国”)发送给服务器的时候,将数据变成0101的二进制数据(假设为98 99)时必然要查码表,浏览器以哪个码表打开网页,浏览...

java中form以post、get方式提交数据中文乱码问题总结(转)

一:form在前台以post方式提交数据:     浏览器将数据(假设为“中国”)发送给服务器的时候,将数据变成0101的二进制数据(假设为98 99)时必然要查码表,浏览器以哪个码表打开网页,浏览器...
  • easyjmz
  • easyjmz
  • 2017年11月15日 18:28
  • 34

找到一篇关于form以post、get方式提交数据中文乱码问题总结

一:form在前台以post方式提交数据:     浏览器将数据(假设为“中国”)发送给服务器的时候,将数据变成0101的二进制数据(假设为98 99)时必然要查码表,浏览器以哪个码表打开网页,...

java中form以post、get方式提交数据中文乱码问题总结

一:form在前台以post方式提交数据:  浏览器将数据(假设为“中国”)发送给服务器的时候,将数据变成0101的二进制数据(假设为98 99)时必然要查码表,浏览器以哪个码表打开网页,浏览器...

java中form以post、get方式提交数据中文乱码问题总结

一:form在前台以post方式提交数据:     浏览器将数据(假设为“中国”)发送给服务器的时候,将数据变成0101的二进制数据(假设为98 99)时必然要查码表,浏览器以哪个码表打开网页,浏览...

java中form以post、get方式提交数据中文乱码问题总结

一:form在前台以post方式提交数据:     浏览器将数据(假设为“中国”)发送给服务器的时候,将数据变成0101的二进制数据(假设为98 99)时必然要查码表,浏览器以哪个码表打开网页,浏览...
  • wish_j
  • wish_j
  • 2016年06月15日 11:12
  • 1423

Android客户端与服务器端的数据通信中文乱码问题

做了一个小的项目用到了客户端与服务器端通信,然而随之而来的问题就有了。 那就是中文乱码问题,由服务器端向客户端或者客户端向服务器端发送数据时,中文变为问号---?????---。    解决的思路...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决GET提交JSON数据在后端的乱码问题
举报原因:
原因补充:

(最多只允许输入30个字)