前端js传递中文参数到Java接收乱码的问题

12 篇文章 0 订阅
10 篇文章 0 订阅

前言

最近一次开发过程中遇到一个关于前端js传递中文参数到Java接收乱码的问题。怎么解决呢?相信网上已经有了各种各样的答案,这次我主要记录一下问题的解决思路。

思考方向

  • 现象
    编辑文本信息保存到数据库,本地环境和开发环境均正常,测试环境数据库对应属性值乱码。
  • 定位
    环境问题;
    检查测试环境mysql的字符规则设置,指定UTF-8,正常;
    打印入参日志,参数值乱码,检测测试环境服务器的字符规则设置,指定en_US.UTF-8,正常;
    检查tomcat字符设置,server.xml文件未指定URIEncoding="utf-8"的编码集,异常;
    tomcat不设置编码时,默认是iso8859-1,即tomcat默认会以iso8859-1编码接收get参数
  • 方案
    修改tomcat配置文件conf/server.xml中
    在这里插入图片描述
    重启tomcat即可。

问题延伸

在Spring框架中我们设置了request.setCharacterEncoding(), 指定后可以通过request.getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码。值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。而且,该指定只对POST方法有效,对GET方法无效。那么GET方法的话,需要在Tomcat的server.xml配置编码规则,如下:

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

如果没人在server.xml中进行字符设置的话,那就需求前端对中文参数进行编码,调用js方法encodeURI(url),将url编码,然后再进行GET请求,后台接受时,需处理接收到的入参,将默认编码iso8859-1转换成UTF-8

String str = new String(request.getParameter("param").getBytes("iso8859-1"),"UTF-8");

另外在其他博主那边又看到这样一种方式,前端针对URL中的所传中文参数进行两次encodeURI转换

encodeURI(encodeURI(keyword))

encodeURI函数采用utf-8进行编码,而在服务器的进行解码时候,默认都不是以uft-8进行解码,所以就会出现乱码。

两次encodeURI,第一次编码得到的是UTF-8形式的URL,第二次编码得到的依然是UTF-8形式的URL,但是在效果上相当于首先进行了一 次UTF-8编码(此时已经全部转换为ASCII字符),再进行了一次iso-8859-1编码,因为对英文字符来说UTF-8编码和ISO- 8859-1编码的效果相同。
在后台接收参数时候,首先通过request.getParameter()自动进行第一次解码(可能是 gb2312,gbk,utf-8,iso-8859-1等字符集,对结果无影响)得到ascii字符,然后再使用UTF-8进行第二次解码,通常使用 java.net.URLDecoder("",“UTF-8”)方法。
在这里插入图片描述
两次编码两次解码的过程为:
UTF-8编码->UTF-8(iso-8859-1)编码->iso-8859-1解码->UTF-8解码,编码和解码的过程是对称的,所以不会出现乱码。
以上这三种方式都是解决GET方式中文传参乱码问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值