关于HTTP GET请求的url中文参数编码
场景:前端用JS构造了一个GET请求,携带了一个中文的参数,通过Spring MVC传到后台以后解析中文是乱码。
1. 发送请求,从浏览器中捕获到http的请求内容如下:
1 Remote Address:[::1]:8080 2 Request URL:http://localhost:8080/fax/downloadFax?fname=%e6%8e%88%e6%9d%832.png 3 Request Method:GET 4 Status Code:201 Created
2. 第一时间认为是URL编解码的问题,所以学习了一下相关的转换方法:
1 //将utf-8格式的中文转换成URL编码 2 encodeStr = URLEncoder.encode(fname, "utf-8"); 3 //将URL编码的字符串转换成utf-8格式的中文 4 decodeFName = URLDecoder.decode(encodeStr, "utf-8");
测试结果,没有达到预期,再仔细看看,笑了,上面不是做了一次A->B->A的无效转码吗?!
3.乱码是怎么回事呢?
我的页面设置的utf-8格式,我的Spring MVC框架的编码filter也配置了utf-8,现在的乱码是怎么回事呢?
4. 原因找到了:
Spring MVC 是基于Servlet,在Http请求到达Servlet解析之前,GET过来的URL已经被Tomcat先做了一次URLDecode。
Tomcat对GET方式默认的URL解码结果是iso-8859-1而不是UTF-8!
5. 解决办法:
decodeFName = new String(fName.getBytes("iso-8859-1"),"utf-8");
由于上述原因,在构造HTTP响应消息时,需要把中文字符再转成iso-8859-1。
6.还有一种办法,就是配置Tomcat:
在Tomcat的conf目录下的server.xml中配置Connector的URIEconding=“UTF-8"属性即可,没有这个参数可以手动加上。
上善若水,水利万物而不争。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?