URL传参数导致乱码

今天在通过jsp给后端传参过程中,发现后台接收的是乱码。花了两个小时,终于解决了,现在记录一下。

背景

现在有一个jsp页面,里面主要的内容是表格,其中表格中的每一行最后一列是操作部分,点击可以对该行进行修改或删除。

如上图,点击"修改"会将左边的参数传给后台。"配电主类型"和"配电副类型"两列看着是文字,实际上传的是数字;参数类型这一项不参与上传;"参数编码"和"参数名称"两项是文字,除此之外,还有一个uuid会传给后台。如下图所示:

在浏览器的地址栏上显示了我所上传的内容:

paraId就是前面提到的uuid;devMainType和devSubType对应配电主类型和配电副类型;paraCode和paraName两项是本文关注的重点,即前面提到的参数编码和参数名称。

问题

在提交了URL之后,会把这些参数传给后台代码,后台代码将转到另一个前端jsp页面,将传的参数显示出来。在这里,后台代码只负责中转,并未对上传参数作处理。但是在显示页面中却出了问题:

(因为其它几项是正常的,就没有截图)本来是中文的参数编码和参数名称都已经乱掉了。

思路

回想整个过程,前端jsp(代号A)获取表格某行中的数据,然后将这些数据传给浏览器(代号B),B将参数传给后台C。

  • 首先,保证A到B,参数没有乱。

  通过对参数加console.log(),发现传的是中文,check.

  • 其次,检查C接收的是还是乱码。如果不是乱码,说明是C的原因导致最后显示有问题;如果已经是乱码,说明是B到C的过程出现了问题。

  对后台加断点,发现在接收的时候,就已经是乱码了。

结论:B应该背锅。

检查浏览器

重新看一下A传数据B的时候发生了什么。打开Chrome Developer Tool

把URL部分放大:

可以发现,paraCode和paraName两项已经变成了%E6%B5%8B等字样。。。。

上面这张图的第一行右边还有"view parsed",点开看一下:

没错,解析出来的确实是我传的。然而被浏览器编码成了这样子:

现在已经可以肯定,浏览器对我URL里面的中文做了某种格式的编码,就变成了%E6%B5...这个样子。那是哪种格式的编码呢?通过站长工具一个一个的试,最后发现是URL编码。

解决

既然浏览器会对中文编码,那传给浏览器时不要包含中文不就好了嘛。但A取到的表格中的数据就是中文怎么办呢?可以在A里就对这些中文进行编码,编码后的结果就是%E6%B5%8B%E8%AF%95了,这时候浏览器就不会再对它加编码了。

步骤

在A中,对paraCode和paraName加两次encodeURI()

在C中,对接收到的参数加一次decode

然后重新看一下最终的显示页面

这两个中文终于能正常显示了:)

疑问1

为什么要A中是两次编码,而C中只有一次解码呢?这是因为tomcat容器已经默认解了一次码。

那又要问了,既然容器默认已经有解码了,那在A中加一次编码,C中不解码可不可以呢?

可能可以,可能不可以。因为容器解码时使用的编码方式是容器的默认编码方式,可能是UTF-8,可能是GBK,也有可能是其它乱七八糟的编码方式。你不能保证跟你的编码方式相同。所以这种方式可能会出现乱码。

如果觉得两次编码的方式太烦了,而一定要使用这种一次编码的方式也是可以的。这里就需要修改容器的默认编码方式,让它与你的编码方式相同。比如修改成UTF-8。怎么修改呢?在tomcat安装目录下conf目录下的server.xml:

把这一行变成

疑问2

细心的朋友可能发现了,浏览器对中文编码之后,向C传的明明是%E6%B5%8B%E8%AF%95这种形式的,为什么C接收到的却是&æ&mirco...这样的html转义字符了呢?好吧,我也不清楚。。。

参考资料:

[1] 关于URL编码 (http://www.ruanyifeng.com/blog/2010/02/url_encoding.html)

时间: 2024-10-13 11:38:44

URL传参数导致乱码的相关文章

java的url有中文参数导致乱码

话不多说,直接粘代码 发送方 UrlParaCode.jsp <%@ page language="java" import="java.util.*" pageEncoding="GBK"%> <html> <head> <title>My JSP 'UrlParaCode.jsp' starting page</title> </head> <body> &l

关于url传参中文乱码问题

之前都一直很不了解中文编码得问题,之前在做项目中没碰到那么头痛的问题.所以一直没有了解中文乱码的问题. 问题描述: 地址: http://localhost:8080/sun-government/contest/get_teams_by_type_with_page?typeName=新材料 当在windows 跑 myeclipse的命令台  能正确打印出typeName的参数,而且持久层并没有问题. 当在 linux 跑catalina模式  打印出乱码,持久层也是乱码. 百度了好几个好几

如何解决url传参导致错误问题

如何解决url传参导致错误问题:如果使用url传并且参数中含有特殊字符的话,那么就会导致一些错误,下面就来介绍一下如何解决此问题.方法很简单,只要使用encodeURI ()函数进行编码即可.如果得到原来的字符串,使用decodeURI()函数即可,这里就不多介绍了.更多相关内容可以参阅js的escape.encodeURI和encodeURIComponent的区别一章节. 原文地址是:http://www.softwhy.com/forum.php?mod=viewthread&tid=97

Java URL传参中文乱码问题

我们经常会遇到这样的场景:在URL中传递参数,如果该参数为中文,如果设置不当,会出现乱码问题. URL传参所使用的编码为服务器中设置的编码,而ajax请求的编码为页面编码. 如果不设置tomcat的默认编码为ISO-8859-1,而如果在设置中加入 useBodyEncodingForURI="true" <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="

thinkphp 3.2.3 入门示例2(URL传参数的几种方式)

原文:thinkphp中URL传参数的几种方式 在thinkphp中,url传参合asp.net中原理类似,下面就单个参数和多个参数传递方式进行一个简单讲解 1.传单个参数 单个参数这种比较简单,例如 想像edit操作里面传递一个id值,如下写法__URL__/edit/id/1 http://localhost/index.php/user/edit/id/1 id和其值1要分别位于/后面 后台获取id通过    $id=$_GET['id']   即可获取其具体值. 2.传多个参数 传多个参

URL传中文参数导致乱码的解决方案之encodeURI

通过URL传中文参数时,在服务端后台获取到的值往往会出现乱码问题,解决方案有很多种,本文主要介绍如何通过encodeURI来解决中文乱码问题: first:前端传递参数的时候需要对中文参数进行两次encodeURI处理: ?var requestUrl = 'url?roleName='+encodeURI(encodeURI("rowObj.appName")); 注:rowObj.appName?表示即将传到后台的带中文的字符串 ?second:在服务器端后台程序代码中要用java

thinkphp中URL传参数的几种方式

在thinkphp中,url传参合asp.net中原理类似,下面就单个参数和多个参数传递方式进行一个简单讲解 1.传单个参数 单个参数这种比较简单,例如 想像edit操作里面传递一个id值,如下写法__URL__/edit/id/1 http://localhost/index.php/user/edit/id/1 id和其值1要分别位于/后面 后台获取id通过    $id=$_GET['id']   即可获取其具体值. 2.传多个参数 传多个参数相对比较麻烦一点,可以通过两种方式 第一种:传

asp.net 页面通过URL传参中文乱码的三种解决方案

1.编码 string state=Server.UrlEncode(stateName.Text.Trim());Response.Redirect("aaa.aspx?state="+state+""); 2.解码(aaa.aspx) string state= Server.UrlDecode(Request.QueryString["state"].ToString()); 是GB2312编码的,参数传值是UTF-8编码的 解决的方法一般

jsp url传中文页面乱码

环境:jsp+tomcat6.0+nginx问题:url传递中文乱码 解决:通过tomcat 配置文件添加编码格式配置即可. 之前一直写成URLEncoding导致改了好几天没改出来.看网上方式都是说加这段.原来是单词写错了