GET请求中的乱码原理解析和解决方案

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 2. 乱码问题解决基础知识1)浏览器会在中文的UTF-8后加上上%得到URL编码   例如: %e8%b4%b9%e7%94%a8%e6%8a%a5%e9%94%802)以get的请求发送到tomcat服务器后又会以默认的(ISO8859-1)解码!!(tomcat7及以前版本是ISO8859...

2. 乱码问题解决

基础知识

1)浏览器会在中文的UTF-8后加上上%得到URL编码   例如: %e8%b4%b9%e7%94%a8%e6%8a%a5%e9%94%80

2)以get的请求发送到tomcat服务器后又会以默认的(ISO8859-1)解码!!(tomcat7及以前版本是ISO8859-1)

3)所以在action 中要先以ISO8859-1解码,在一UTF-8编码得到中文字符

 

表单采用Post方式提交,解决乱码的方法为:

request.setCharacterEncoding( myEncoding );

 

表单采用Get方式提交,解决乱码的方法为:

方式一:

key = new String(key.getBytes("iso8859-1"), "utf-8");

方式二:

修改server.xml: URIEncoding="utf-8"

默认情况下,tomcat使用的的编码方式:iso8859-1

修改tomcat下的conf/server.xml文件

找到如下代码:    
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
这段代码规定了Tomcat监听HTTP请求的端口号等信息。

可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。

修改完成后:

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

 

http://localhost:8080/ItcastOA20160614/processDefinition_delete.action?key=%25E8%25B4%25B9%25E7%2594%25A8%25E6%258A%25A5%25E9%2594%2580%25E6%25B5%2581%25E7%25A8%258B

 

方式三(不依赖Tomcat的配置,推荐):

浏览器中两次URL编码。

服务器中自己再做一次URL解码。

原理:

如果只进行一次encodeURI,得到的是UTF-8形式的URL,服务器端通过request.getParameter()解码查询参数(通常是iso-8859-1)就会得到乱码。

 

如果进行两次encodeURI,第一次编码得到的是UTF-8形式的URL,第二次编码得到的依然是UTF-8形式的URL,但是在效果上相当于首先进行了一次UTF-8编码(此时已经全部转换为ASCII字符),再进行了一次iso-8859-1编码,因为对英文字符(ASCII字符)来说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解码,编码和解码的过程是对称的,所以不会出现乱码。

 

自己

<s:a action="processDefinitionAction_delete" onclick="return delConfirm()">

<s:param name="key" value="%{@java.net.URLEncoder@encode(key, 'utf-8')}"></s:param>

删除

</s:a>

 

%{@java.net.URLEncoder@encode(key, 'utf-8')}

 

<s:a action="processDefinitionAction_delete" onclick="return delConfirm()">

<s:param name="key" value="%{@java.net.URLEncoder@encode(key, 'utf-8')}">

</s:param>

删除

</s:a>

此处自己先编码一次,发出请求时,浏览器又会编码一次,所以是两次编码

 

 

<script type="text/javascript">

    function showProcessImage( pdId ){

    // alert("原文:" + pdId);

    

    pdId = encodeURI(pdId);

    // alert("第一次URL编码:" + pdId);

 

    pdId = encodeURI(pdId);

    // alert("第二次URL编码:" + pdId);

    

            var url = "processDefinitionAction_downloadProcessImage.action?id=" + pdId + "&t=" + new Date();

            window.showModalDialog(url, null, "dialogHeight:500px;dialogWidth:600px;resizable:yes");

        }

</script>

 

此处需要自己编码两次

 

 

总结:在页面encodeURI("url")后浏览器就不会给中文utf-8之后又加%,中间过程任何其他编码都是兼容英文(ASCII字符),所以在action代码里URLDecoder.decode("key","UTF-8")就可以了。

目录
相关文章
|
26天前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
88 3
|
1月前
|
存储 人工智能 自然语言处理
高效档案管理案例介绍:文档内容批量结构化解决方案解析
档案文件内容丰富多样,传统人工管理耗时低效。思通数科AI平台通过自动布局分析、段落与标题检测、表格结构识别、嵌套内容还原及元数据生成等功能,实现档案的高精度分块处理和结构化存储,大幅提升管理和检索效率。某历史档案馆通过该平台完成了500万页档案的数字化,信息检索效率提升60%。
|
29天前
|
存储
文件太大不能拷贝到U盘怎么办?实用解决方案全解析
当我们试图将一个大文件拷贝到U盘时,却突然跳出提示“对于目标文件系统目标文件过大”。这种情况让人感到迷茫,尤其是在急需备份或传输数据的时候。那么,文件太大为什么会无法拷贝到U盘?又该如何解决?本文将详细分析这背后的原因,并提供几个实用的方法,帮助你顺利将文件传输到U盘。
|
1月前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
45 3
|
1月前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
46 1
|
16天前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
45 0
|
22天前
|
API 持续交付 网络架构
深入解析微服务架构:原理、优势与实践
深入解析微服务架构:原理、优势与实践
22 0
|
23天前
|
存储 供应链 物联网
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
|
23天前
|
存储 供应链 安全
深度解析区块链技术的核心原理与应用前景
深度解析区块链技术的核心原理与应用前景
31 0
|
1月前
|
供应链 安全 分布式数据库
探索区块链技术:从原理到应用的全面解析
【10月更文挑战第22天】 本文旨在深入浅出地探讨区块链技术,一种近年来引起广泛关注的分布式账本技术。我们将从区块链的基本概念入手,逐步深入到其工作原理、关键技术特点以及在金融、供应链管理等多个领域的实际应用案例。通过这篇文章,读者不仅能够理解区块链技术的核心价值和潜力,还能获得关于如何评估和选择适合自己需求的区块链解决方案的实用建议。
64 0

推荐镜像

更多