关于tomcat版本不同导致的get请求携带中文参数乱码的问题产生的过程

news/2024/11/16 12:43:04/

URL编码网址链接:https://tool.ip138.com/urlencode/

        String arg = "中文";  //模拟浏览器get请求输入中文参数byte[] bytes1 = arg.getBytes(StandardCharsets.UTF_8);String res1 = URLEncoder.encode(arg, "UTF-8"); //浏览器地址栏URL编码String decode = URLDecoder.decode(res1, "ISO-8859-1"); //tomcat8以后默认都是utf-8,但是这里模拟的是tomcat8之前的版本,默认iso-8859-1解码byte[] bytes = decode.getBytes(StandardCharsets.ISO_8859_1);String res2 = new String(bytes, "UTF-8");String res3 = new String(bytes1,"iso-8859-1");System.out.println(res2);

解析:
第一行我首先创建了一个名为“中文”的字符串,
第二行我使用getBytes方法根据指定的UTF-8编码返回该字符串在该编码下的byte数组,
第三行我使用URLEncoder.encode方法将"中文"以UTF-8编码转为URL编码后的res1(这里模拟浏览器发送get请求携带中文参数的情况,一般HTML文件都是指定UTF-8编码),
第四行我将编码后的结果模拟发送到tomcat,假设tomcat版本为7,那么默认会使用iso-8859-1编码方式去解码,于是就有了String decode = URLDecoder.decode(res1, "ISO-8859-1");以下是URLDecoder.decode方法的注释

Decodes a application/x-www-form-urlencoded string using a specific encoding scheme. The supplied encoding is used to determine what characters are represented by any consecutive sequences of the form “%xy”.
使用特定的编码方案对application/x-www-form-urlencoded字符串进行解码。所提供的编码被用来确定任何连续的"%xy “形式的序列所代表的是什么字符。
也就是说这个方法走了两步,第一步是确定任何连续的”%xy "形式的序列所代表的是什么字符,第二步是将确定后的字符按iso-8859-1编码方式去编码

第五行是将上一步编码后的字符串decode按iso-8859-1字符集编码为字节数组,这样就拿到了传入的字节数组bytes
第六行是将bytes按UTF-8字符集解析成字符串
第七行就是将第二行中的bytes1字节数组按iso-8859-1字符集解析为字符串,这一步是用来确定是否和tomcat解析的decode相等,事实证明是相等的
最后输出正常中文


http://www.ppmy.cn/news/60688.html

相关文章

【面试】面试官:说一下线程池7个参数的含义?

文章目录 前言一、参数1:corePoolSize二、参数2:maximumPoolSize三、参数3:keepAliveTime四、参数4:TimeUnit五、参数5:BlockingQueue六、参数6:ThreadFactory七、参数7:RejectedExecutionHandl…

api数据接口文档_接口文档示例(以1688平台API接口文档实例演示)

api数据接口文档_接口文档示例 本文主要是提供了一个接口文档的范文,内容修订历史、目录、时序图、接口要素描述、接口说明、使用示例、字典、FAQ。 使用MD格式文档(makedown),选择原因,容易格式转换,开发…

中间件漏洞(一)CVE-2013-4547(文件名逻辑漏洞)

目录 1. 了解nginx的工作原理 2. 漏洞原理及举例分析 3. 前端php源码分析 4. 注入思路 5. 漏洞复现 5.1 上传文件并抓包分析 5.2 通过访问文件执行php 注意一点 6. 漏洞修复 1. 了解nginx的工作原理 nginx是以PHP语言为主。像Apache一样,Nginx自身是不支持解…

Android 9.0 系统systemui状态栏下拉左滑显示通知栏右滑显示控制中心模块的流程分析

1.前言 在android9.0的系统rom定制化开发中,在系统原生systemui进行自定义下拉状态栏布局的定制的时候,需要在systemui下拉状态栏下滑的时候,根据下滑坐标来 判断当前是滑出通知栏还是滑出控制中心模块,所以就需要根据屏幕宽度,来区分x坐标值为多少是左滑出通知栏或者右…

在选择数据库时需要考虑的因素

在文章的第一部分中,我们奠定了理解各种数据库类型及其用例的基础。随着我们继续探索数据库选择的艺术,我们现在将更深入地探讨影响这个决策过程的关键因素。通过更详细地检查每个因素,我们可以更好地装备自己做出符合项目要求的知情选择&…

PostgreSQL数据库中的角色(Role)、用户(User)、模式(Schema)

文章目录 PostgreSQL数据库中的角色(Role)、用户(User)、模式(Schema)角色(Role)和用户(User)角色操作CREATE ROLE 创建角色ALTER ROLE修改角色属性DROP ROLE删除属性GRANT赋予权限REVOKE移除权限CREATE US…

虚析构函数相关知识

问题一:哪些函数不能实现为虚函数 注:虚函数的条件: 虚函数能产生地址,存在vftable中 对象必须存在(vfptr->vftable->虚函数地址) 构造函数 virtual构造函数,错误构造函数中调用虚函数,不会发生动态绑…

Eplan 部件库导入部件的方法

1. 部件宏文件如何下载 1.1 西门子部件宏文件下载 EPLAN 的部件库是可以更新的,一般元器件厂商会提供其部件文件,以 SIEMENS 为例 进入网站,点击EPLAN 的图标 https://www.automation.siemens.com/bilddb/index.aspx?langen 在订货号中输…