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

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

如何解决Get提交数据乱码问题

使用get方法提交的数据,servlet收到的数据有时候会出现乱码问题。 解决方法1、在服务器中,将接收到的字符串数据重新编码 String st=new String(request.getPa...
  • jiangwayne
  • jiangwayne
  • 2015年08月19日 22:29
  • 385

Get请求中文乱码问题有效解决方法

项目中遇到在前台用get方法传递中文到后台拿到的是乱码问题,花了好长时间解决, 下面是解决办法:     1、在IDEA编辑器里的编码格式都改成utf-8。     2、Get方式的乱码问题,由...
  • a1165117473
  • a1165117473
  • 2017年07月28日 10:35
  • 762

解决表单GET提交后台数据乱码问题

​在页面上提交数据到服务器有两种方式“GET”和“POST”,当使用“GET”时,传输的数据是直接拼接在URL后面的。当数据中含有对HTML来说不安全的字符例如中文时,就会被编码,一般采用的是UTF-...
  • ForeverCjl
  • ForeverCjl
  • 2014年07月01日 11:45
  • 2112

过滤器解决get和post方式提交的中文乱码

对于国内的程序员来说,在做项目时避免不了的问题是中文乱码问题。        如果不使用过滤器的话,在每个servlet中都要进行设置编码,如果是post请求还好,但是如果是get请求,就要手动进行...
  • hyn150
  • hyn150
  • 2017年04月19日 21:23
  • 1728

后台 与 js 处理Get方式提交的中文参数乱码问题

1.javascript对URL中的中文处理       使用方法是:encodeURI(url)      注意: 有人说:一定要使用两次,也就是encodeURI(encodeU...
  • simaweier
  • simaweier
  • 2013年09月19日 17:40
  • 5635

JSP使用get方法提交表单或者超链接传递参数时候中文乱码的解决方法

使用表单的方法传递中文参数不会出现中文乱码,但是使用链接传递参数的时候会出现, 一种解决方法是将你接受的参数转码,如原来接收的语句如下: String username = request.getPa...
  • tiange_xiao
  • tiange_xiao
  • 2016年05月28日 14:44
  • 2152

Get请求,Post请求乱码问题解决方案

之所以出现乱码,主要是由于编码和解码采用的方法不同。 因此保证编码解码格式一致是避免乱码发生的重要前提。 问题背景:JavaWeb技术下,Tomcat作为容器,发送请求的时候出现乱码问题。...
  • u014424628
  • u014424628
  • 2015年09月07日 00:41
  • 8983

解决Spring MVC中get请求参数乱码的一种不改tomcat配置解决方法

一种解决Spring mvc中get请求乱码,又不想改tomcat配置,也不想在每个地方转换,这里提供了一种方便的方式...
  • quiet_coding
  • quiet_coding
  • 2017年03月06日 11:28
  • 1007

get方式传值中文乱码

如下情况: 点击超链接,则传值到servlet中,在servelt中通过request.getParameter("bname"); 获取到的中文字符都显示...
  • gg12365gg
  • gg12365gg
  • 2016年08月28日 19:14
  • 11027

解决struts2以GET方式提交表单中文乱码问题

之前用POST方式提交表单一直没有遇到中文乱码的方式,最近使用GET方式提交,发现中文乱码。 检测了struts.xml和web.xml等地方读配置好了 struts.xml web.xml...
  • lixwjava
  • lixwjava
  • 2015年11月29日 17:25
  • 1931
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决GET提交JSON数据在后端的乱码问题
举报原因:
原因补充:

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