开发者社区> 技术小阿哥> 正文

Tomcat 中 GET方式 请求 中文乱码 出现的原因

简介:
+关注继续查看

 网上很多关于GET方式请求中文乱码的解决方案,大体类似. 这里主要讲一下Tomcat在处理URL参数过程中, 究竟是为什么会导致了GET方式请求的中文乱码. 一句话概括就是: Tomcat默认将单字节作为一个字符,但是中文是2个字节表示一个字符....

首先来一个Tomcat解析URL中参数的序列图,其中阴影部分就是造成乱码的地方.

 测试场景:

对于一个从官方下载的Tomcat6,不去任何配置.(这里强调不去任何配置主要是指不在Tomcat的server.xml文件中作任何修改.) 

在Tomcat的 webapps/ROOT目录下新建一个test.jsp:


  1. <html> 
  2. <head><title></title></head> 
  3. <body> 
  4. <
  5.     String name = request.getParameter("name" ); 
  6.     System.out.print(name ); 
  7. %> 
  8. </body> 
  9. </html> 

 然后发起这样一个请求 http://localhost:8080/test.jsp?name=ni%D5%C6%B9%F1

(真实面目是:http://localhost:8080/test.jsp?name=ni掌柜 )

 接着我们定位到上面阴影部分的代码:


  1. private String urlDecode(ByteChunk bc, String enc) 
  2.         throws IOException { 
  3.         if( urlDec==null ) { 
  4.             urlDec=new UDecoder();    
  5.         } 
  6.         urlDec.convert(bc); //这个方法影响不大,只是对那个java.net.URLEncod...编码的进行处理. 
  7.         String result = null
  8.         if (enc != null) { 
  9.             //关键问题:如果这里没有指定URIEncoding的话, 那么enc是null 
  10.             bc.setEncoding(enc); 
  11.             result = bc.toString(); 
  12.         }  
  13.         //这个地方如果没有配置URIEncoding,那么走else的流程,所以就会按照字节来 
  14.         else { 
  15.             CharChunk cc = tmpNameC
  16.             int length = bc.getLength(); 
  17.             cc.allocate(length, -1); 
  18.             // Default encoding: fast conversion 
  19.             byte[] bbuf = bc.getBuffer(); 
  20.             char[] cbuf = cc.getBuffer(); 
  21.             int start = bc.getStart(); 
  22.             for (int i = 0; i < length; i++) { 
  23.                 cbuf[i] = (char) (bbuf[i + start] & 0xff); 
  24.             } 
  25.             cc.setChars(cbuf, 0, length); 
  26.             result = cc.toString(); 
  27.             cc.recycle(); 
  28.         } 
  29.         return result; 
  30.     } 

在运行过程中可以看到, 到进入这个方法的时候,还没有乱码 :

然后是到urlDec.convert(bc);

这个方法影响不大,只是对那个java.net.URLEncod...编码的进行处理.

关键是下面部分:看上面代码中,如果 enc == null, 也就是说server.xml中没有设置URIEncoding.

那么进入了else代码段.

这一进入就完了,可以看到他的处理是按单字节作为一个字符, 于是上面的 "ni%D5%C6%B9%F1" 在它眼里就是6个字符了 .(实际上 ni掌柜 是4个字符), 所以显然就是乱码. 如下:

那么在server.xml文件中设置了URIEncoding, 比如: URIEncoding="GBK". 于是在上面代码中,就会进入下面代码段:


  1. if (enc != null) { 
  2.         //关键问题:如果这里没有指定URIEncoding的话, 那么enc是null 
  3.            bc.setEncoding(enc); 
  4.            result = bc.toString(); 
  5.        }  

如下:



本文转自 nileader 51CTO博客,原文链接:http://blog.51cto.com/nileader/384353,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
服务器支持访问静态文件的几种方式:Spring、Tomcat、Vue
服务器支持访问静态文件的几种方式:Spring、Tomcat、Vue
158 0
【Linux】安装Tomcat以yum方式安装
启动tomcat并设置开机自启
113 0
将tomcat源码以maven方式运行
将tomcat源码以maven方式运行
85 0
反向代理方式实现IIS与Tomcat整合
反向代理方式实现IIS与Tomcat整合
48 0
启动 Tomcat 应用服务器端口 8080 被占用排查思路及解决方式
启动 Tomcat 应用服务器端口 8080 被占用排查思路及解决方式
96 0
JavaWeb概念、Tomcat的安装与目录介绍和部署方式
本文对JavaWeb概念、Tomcat的安装与目录和部署方式进行了详细的介绍,文中通过举例,带你更快的理解本文重点内容。
46 0
tomcat三种部署方式和推荐方式
tomcat三种部署方式和推荐方式
61 0
linux :关闭tomcat端口(命令方式)
linux :关闭tomcat端口(命令方式)
307 0
Docker方式启动tomcat,访问首页出现404错误(第二篇 -- 将修改过的容器映射成镜像)
Docker方式启动tomcat,访问首页出现404错误(第二篇 -- 将修改过的容器映射成镜像)
106 0
Docker方式启动tomcat,访问首页出现404错误
Docker方式启动tomcat,访问首页出现404错误
76 0
涨姿势!Tomcat服务器启动项目的几种方式使用说明
本文的写作缘由一个需要使用Tomcat服务器启动制定文件夹的项目。具体介绍了在Tomcat服务器中启动指定项目的三种方式,包括在server.xml中配置Context,在conf.Catalina.localhost新建xml文件和修改server中的appBase。通过对这三种方式的学习,我们可以很轻松的使用这三种方式启动指定的文件夹下的项目。
519 0
springboot 集成外部tomcat war包部署方式
springboot 集成外部tomcat war包部署方式
124 0
Java编程——Tomcat基本概念及常用调优方式
  Tomcat是什么 开源的 Java Web 应用服务器,实现了 Java EE(Java Platform Enterprise Edition)的部 分技术规范,比如 Java Servlet、Java Server Page、JSTL、Java WebSocket。
1114 0
linux下启动和关闭tomcat服务的方式
Linux下tomcat服务的启动、关闭与错误跟踪,通常通过以下几种方式启动关闭tomcat服务: 切换到tomcat主目录下的bin目录 启动tomcat服务 生产模式: 方式一:直接启动 ./startup.
2097 0
+关注
技术小阿哥
文章
问答
视频
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载