关闭

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

标签: 乱码json
53人阅读 评论(0) 收藏 举报
分类:

环境: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中两次解码解决。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:199次
    • 积分:32
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:1篇
    • 评论:0条
    文章分类
    文章存档