-
2021-02-12 20:36:54
在jsp中常见的乱码解决办法无外乎是关于get和post两种方式的,但只有切实地在实践中使用时才会注意或者说注重到其他方式。例如,在http请求头中传送中文参数,出现乱码,如何解决?
实际场景:使用Spring提供的RestTemplate向WebService发送put请求,使用HttpHeader类装载需要传递的参数(包括中文)。请求端系统使用的是utf-8编码,而服务端使用的是gbk编码,使用http监听工具查看所发出的http请求信息,发现header中的中文参数乱码。
尝试的方法:
1. 在服务端接收到参数时,utf-8转gbk,无效。
2. 在服务端接收到参数时,iso-8859-1转gbk,无效。
3. 在发送请求前将中文参数转码,utf-8转iso-8859-1,无效。代码如下:
new String(remark.getBytes("UTF-8"), "ISO-8859-1")
4. 在请求端,HttpHeader设定ContentType为“application/json;UTF-8",无效。代码如下:
headers.setContentType(Media.valueOf("application/json;UTF-8"));
写到这里,有人应该感觉到这有点“病急乱投医”的感觉了,没有头绪地在试着各种方式。是的,起初我觉得是请求header中采用了ISO-8859-1的编码,但尝试后很显然不是;后来我觉着是否是RestTemplate中采用的HttpMessageConverter方式所决定的,但没能找到很好的证明方式,查资料说的是StringHttpMessageConverter默认采用的是ISO-8859-1编码,可我觉得我指定了ContentType为application/json,RestTemplate不应该去调用StringHttpMessageConverter啊,其中的原理还有待深究。个人感觉这种情况出问题的可能性最大。
最后,在网上看到一篇文章后,看了一种建议方式,并且是可行的,就是使用URLEncode,将中文参数在传参前进行encode。这里以GBK编码是为了在服务器端接收参数后无需再转码了,如下:
list.add(URLEncode.encode(name, "GBK"));
URLEncode方式可以解决这种特定场景的中文乱码问题,相信理解其原理后还可以运用到更多的场景。目前我在网上看到的,关于用URLEncode处理中文乱码最多的场景就是文件下载时中文文件名乱码。
关于Java中文乱码的原理及解决办法可以参看一下下面的链接,很有用。
更多相关内容 -
页面get请求 中文参数方法乱码问题的快速解决方法
2020-09-02 06:44:37下面小编就为大家带来一篇页面get请求 中文参数方法乱码问题的快速解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 -
http请求中文参数乱码
2021-04-12 21:27:02对于做后端的朋友来说,httpPost请求用的非常多,在参数传递过程中,中文参数乱码情况经常出现,有时很让我们头疼。最近解决了一些实际工作中的参数乱码问题后,我也做了些总结,现分享给大家。 以HttpClient为例,...对于做后端的朋友来说,httpPost请求用的非常多,在参数传递过程中,中文参数乱码情况经常出现,有时很让我们头疼。最近解决了一些实际工作中的参数乱码问题后,我也做了些总结,现分享给大家。
以HttpClient为例,常见的传参方式有:
1、UrlEncodedFormEntity,如下面代码片段:
nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("name", "张三")); nvps.add(new BasicNameValuePair("id", "12312312311")); httpPost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));
UrlEncodedFormEntity以字符串键值对形式传给后台,即:{"a":"value1", "b":"value2"},传给java方法,接收到的参数是:a=value1&b=value2,它不支持json参数传递。
2、StringEntity,如下面代码片段:
httpPost.setEntity(new StringEntity(JSON.toJSONString(paramMap), Consts.UTF_8));
StringEntity传参,后台接收到的依然是 {"a":"value1", "b":"value2"},即StringEntity能传递json,当然,如果你传递的就是一个普通的字符串,StringEntity也是支持的。
对于第一种方式(UrlEncodedFormEntity),服务接收端一般采用request.getParameter()方式接参,这种情况下只要服务请求端设置参数时指定了UTF-8或者GBK编码就不会出现中文乱码问题,此处不再多说。下面,主要说一下第二种方式(StringEntity)传参时出现中文乱码的情况及解决方案。
情况一:服务请求端设置参数时没有指定编码方式,此时会默认ISO-8859-1方式编码,服务接收端中文乱码,无法解决,所以服务请求端设置参数时必须指定编码方式(UTF-8或GBK)。
情况二:服务请求端设置参数时指定了编码方式,但是服务接收端有时会乱码,有时不会,服务接收端接参方式如下:
@RequestMapping(value = "/testB") @ResponseBody public void testB(HttpServletRequest request) throws Exception { String body = ""; try { ServletInputStream inputStream = request.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); while(true){ String info = br.readLine(); if(info == null){ break; } if(body == null || "".equals(body)){ body = info; }else{ body += info; } } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("入参:" + body); }
后来发现,出现这种现象的原因是服务接收端用流的方式读取参数时没有指定解码方式,这样会默认采用服务器环境的编码方式,所以在不同的服务器环境下有时会出现乱码,有时不会。找到原因后,接参的时候指定解码方式不就得了?结果问题又来了,我咋知道客户端设置参数时指定的是哪种编码方式啊?后来复习了http协议后明白了,从请求报文中就能拿到编码格式额,好吧,于是代码优化为:
经过测试,问题得以解决。其实,还有更简单的接参方式:
@RequestMapping(value = "/testA") @ResponseBody public void testA(@RequestBody String para) throws Exception { System.out.println("入参:" + para); }
通过@RequestBody注解,直接拿到参数,并且不存在乱码问题。这样既简单又好用,但是我在想为啥它就不存在乱码问题了呢,我猜测中间有个环节必定也通过获取请求端编码方式并以此为依据解析参数的。于是查了下相关的源码,印证了我的猜测,其中有一段代码如下:
至于如何一步步调到这个方法的,中间过程很复杂,感兴趣的可以参考下面大佬的文章链接,并自己走一遍看看:
Spring MVC源码(三) ----- @RequestBody和@ResponseBody原理解析
以上几种情况基本涵盖了httpPost请求中文参数乱码的常见问题及解决,希望能帮到遇到类似问题的朋友,不足之处敬请斧正。
-
关于Ajax请求中传输中文乱码问题的解决方案
2020-12-09 06:42:52今天遇到一个问题,有关ajax 请求中传输中文,遇到乱码的问题。 如下代码: function UpdateFolderInfoByCustId(folderId, folderName, custId) { $.ajax({ type: "Post", contentType: "application/x-... -
怎么解决java中的http请求乱码
2021-02-27 15:07:09怎么解决java中的http请求乱码发布时间:2020-06-23 20:00:11来源:亿速云阅读:90作者:元一怎么解决java中的http请求乱码?针对这个问题,今天小编总结了这篇文章,希望能帮助更多想解决这个问题的朋友找到更加...怎么解决java中的http请求乱码
发布时间:2020-06-23 20:00:11
来源:亿速云
阅读:90
作者:元一
怎么解决java中的http请求乱码?针对这个问题,今天小编总结了这篇文章,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。
HTTP简介
HTTP又名超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。
HTTP请求乱码解决方案一
接着上面的代码,用我们最常用的方式,一行一行的读,charset 同上面一样。StringBuffer sb = new StringBuffer("");
in = new BufferedReader(new InputStreamReader(inStream, charset));
String line = "";
while ((line = in.readLine()) != null){
sb.append(line);
}
result = sb.toString();
HTTP请求乱码解决方案二
这也是最简单的方式,主要是用IOUtils工具类。URL realUrl = new URL(url);
// 打开和URL之间的连接
conn = (HttpURLConnection) realUrl.openConnection();
// 发送POST请求必须设置如下两行
conn.setRequestMethod(StringUtils.upperCase(type));// 提交模式
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setRequestProperty("Connection", "close");
conn.setConnectTimeout(3000); //设置连接主机超时(单位:毫秒)
conn.setReadTimeout(2000); //设置从主机读取数据超时(单位:毫秒)
//省略一些代码
//获取InputStream
InputStream inStream = conn.getInputStream();
//通过IOUtils 转化,把流转换为字符串。
//charset为编码格式,可选为"utf-8","gbk","gb2312"等等
String result = IOUtils.toString(inStream,charset);
关于解决java中的http请求乱码的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
-
javaweb的http数据传输中文乱码问题解决
2019-08-07 18:07:49在前端与后台进行数据交互的过程,我们常遇到一种问题:中文乱码。追根到底这是因为中文的特殊性,在编码和解码过程中,可能用到的是两种编码方式,导致编码后再解码就乱码了(英语优势在哪,所以人家没有这方面的...背景
在前端与后台进行数据交互的过程,我们常遇到一种问题:中文乱码。追根到底这是因为中文的特殊性,在编码和解码过程中,可能用到的是两种编码方式,导致编码后再解码就乱码了(英语优势在哪,所以人家没有这方面的问题,我也一直在想,为啥不统一一下,解决这个乱码问题了。)
回到正题,有问题那我们就得解决问题啊。总不能有问题我就不干了不是。所以本篇文章闲扯了这么久,开始总结中文乱码问题解决方法。
总概
我将从request和response(也就是后台收到的请求和发送给前端的响应两部分来总结)
我们对所有编码全部采用UTF-8编码方式(UTF-8包含全世界所有国家需要用到的字符)
request(请求)
这里我默认大家都有了一定的java后台的基础,知道前端发送数据给后台,并且知道一般分为get和post两种请求方式。
对于get请求:
我们需对请求的数据变成没有编码的byte流再对byte流进行UTF-8编码,实现如下:
String newData = new String(oldData.getBytes(“ISO-8859-1”), “UTF-8”);
注:tomcat默认的解析url(也就包含?后面的get数据)的编码方式为ISO-8859-1这里就可以引出处理get请求乱码的第二种方式 ↵
——修改tomcat的service.xml文件
打开\tomcat7\conf文件夹下的service.xml文件。可以看到
修改为:
这样,就直接将url的编码方式变成了UTF-8。不用做其他处理也不会有乱码了。
对于post请求
我们在用 request.getParameter()获取数据前先使用以下代码
request.setCharacterEncoding(“UTF-8”);
这段代码的作用是设置请求体的文字的编码方式,一定要写在 获取数据之前response(响应)
一行代码即可
response.setContentType(“text/html;charset=UTF-8”);
以上代码设置了响应的内容类型(text/html)和编码方式(charset=UTF-8)##总结
下面我们将在总结的基础上再总结,讲下日常敲代码中怎么用。首先,根据以上,我们可以知道,中文乱码必定是 request的get方法、request的post方法、response三种中的一种或多种造成的。也就是说,我们把他们三个都搞定。就没问题了。
第一步:解决 request的get方法
修改tomcat的service.xml文件:
第二步:解决request的post
在获取数据前加入以下代码
request.setCharacterEncoding(“UTF-8”);
第三步:解决response在设置响应的数据前加入以下代码
response.setContentType(“text/html;charset=UTF-8”);
-
web 实战-10-HTTP post 请求中文乱码
2021-03-08 09:49:17然后 jsp 去接受,结果发现中文乱码。解决方案尝试1设置 request 接受编码request.setCharacterEncoding("utf-8");发现没有效果尝试2去乱码的部分尝试解码:value = java.net.URLDecoder.decode(value,"UTF-8");发现... -
Java 之 HTTP请求乱码解决,GZIP 返回值乱码解决
2021-02-12 23:02:54今天请求一个天气接口,发现一直乱码,开始没注意看请求头...HTTP请求乱码解决方案一这也是最简单的方式,主要是用IOUtils工具类。URL realUrl = new URL(url);// 打开和URL之间的连接conn = (HttpURLConnection) ... -
C# HTTP请求返回内容为乱码解决办法
2022-03-06 20:58:16C# HTTP请求返回内容为乱码解决办法 -
Java(25):HttpClient发起请求中文数据乱码问题解决
2021-09-23 11:36:49原因:再做接口自动化测试过程中,发现发送POST请求时,请求成功后,新增的角色描述有中文,新增成功后出现乱码。 解决方法:在POST方法初始化StringEntity时指定UTF-8 原来代码如下: public static ... -
axios get请求中文乱码
2022-04-18 23:42:51axios get 中文乱码 -
Ajax请求时传输中文乱码怎么解决
2021-04-09 10:30:03这次给大家带来Ajax请求时传输中文乱码怎么解决,解决Ajax请求时传输中文乱码的注意事项有哪些,下面就是实战案例,一起来看一下。今天遇到一个问题,有关ajax 请求中传输中文,遇到乱码的问题。如下代码:function ... -
使用http请求发送文件,文件标题乱码
2021-12-22 11:39:55使用http请求发送文件,文件标题乱码(内容正确) 项目中的代码大致如下: 最终的结果是,文件上送成功,文件的内容正常,但是文件的标题乱码。 InputStream is = null; DataOutputStream dos = null; // 读取... -
Http协议中关于请求与响应中文参数乱码问题详解
2020-07-05 10:49:56表单里的参数是字符,在数据传输的过程中编码为utf-8的字节,tomcat中默认以iso-8859-1的方式解码,所以必须要修改解码是查询的码表: 如果是post请求,在获取参数代码之前: request.setCharacterEncoding("utf-8"); ... -
解决post请求中文乱码问题
2022-04-16 16:47:35在java中使用servletrequest获取用户输入的数据可能会出现中文乱码的情况,此时只需要使用以下语句即可(根据输入的字符集自行修改) // 在doGet方法中加入即可 // 解决post中文乱码 request.setCharacter... -
C++ Http请求中文传参乱码问题
2017-08-31 10:34:26我们必须把含有中文的参数转换为url编码(中文自动转%xx,英文数字等其它不会变),转换后一个汉字对应两组%xx,即%xx%xx。 url编码输入必须是utf8编码。 在Unicode字符集环境下,需要做如下转换: Unicode->UTF-8->... -
http模块解决中文乱码问题
2022-04-05 15:52:31昨天分享了怎么样创建最简单的web服务器以及和大家介绍了什么req请求对象和res相应对象,在上次分享中,使用"res.end()"方法向客户端相应内容时,我们传送的时英文内容,如果我们向客户端传送中文内容会怎.. -
Java 发送POST请求 中文乱码
2021-05-08 00:09:19问题:在Java代码中发送Http请求后,接收端出现中文乱码都是??? 错误的做法:对发送的数据(String类型)做编码处理 jsonStr.getBytes("UTF-8"); 正确的做法:对Http发送数据的Entity做处理 httpPost.setEntity... -
URLConnection发送HTTP请求url路径携带中文为乱码问题
2022-02-10 17:00:04使用URLEncoder工具类对中文字符串进行转换 String encode = URLEncoder.encode("字符串","utf-8"); 以请求高德地图webapi为例 import java.net.URLEncoder; import java.io.BufferedReader; import java.net... -
使用SpringMVC参数传递时,解决get请求时中文乱码的问题
2020-12-29 03:07:35问题描述:使用SpringMVC参数传递时, 遇到get请求中文信息时,页面应答会显示中文乱码.解决办法:一, 我们需要把request.getParameter(“参数名”)获取到的字符串先用ISO-8859-1编码成字节流,然后再将其用utf-8解码成... -
关于HTTP协议传输数据时出现中文乱码的问题(未解决)
2019-11-26 10:58:02接了个小项目,是一个winform的小项目,把界面人工输入的数据通过http协议的形式传输到服务器上,在做的过程中碰到了中文乱码的问题,我自己做了一个模拟的服务器,GlassFish Server 4.1做web服务器,用了jodd自带的... -
ajax请求乱码的解决方法(中文乱码)
2020-12-11 07:42:20今天遇到一个问题,有关ajax请求中传输中文,遇到乱码的问题。 如下代码: 代码如下:function UpdateFolderInfoByCustId(folderId, folderName, custId) { $.ajax({ type: “Post”, contentType: “application/... -
解决Python发送Http请求时,中文乱码的问题
2020-11-22 16:02:17原理:msg.encode('utf-8')是解决中文乱码问题。quote():假如URL的 name 或者 value 值中有『&』、『%』或者『=』等符号,就会有问题。所以URL中的参数字符串也需要把『&=』等符号进行编码,quote()就是对参数字符... -
nodejs fetch 请求返回中文乱码解决方法
2022-05-04 23:15:44使用node-fetch请求数据,返回带有中文的json数据乱码。 let rsp = await fetch("http://api.com"); let result = await rsp.json(); // 用json解析后,中文乱码 原因分析: 后端中文编码格式是GBK格式,但是node-... -
关于Http请求GBK乱码转化的问题
2019-05-22 19:13:18class POST请求GBK乱码转化 { public void Start() { //将需要传入的中文参数转化为GBK格式 string INFO = System.Web.HttpUtility.UrlEncode("北京市国家税务局", Encoding.GetEncoding("GBK")); ...