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,如需转载请自行联系原作者

相关文章
|
6月前
|
监控 网络协议 应用服务中间件
【Tomcat源码分析】从零开始理解 HTTP 请求处理 (第一篇)
本文详细解析了Tomcat架构中复杂的`Connector`组件。作为客户端与服务器间沟通的桥梁,`Connector`负责接收请求、封装为`Request`和`Response`对象,并传递给`Container`处理。文章通过四个关键问题逐步剖析了`Connector`的工作原理,并深入探讨了其构造方法、`init()`与`start()`方法。通过分析`ProtocolHandler`、`Endpoint`等核心组件,揭示了`Connector`初始化及启动的全过程。本文适合希望深入了解Tomcat内部机制的读者。欢迎关注并点赞,持续更新中。如有问题,可搜索【码上遇见你】交流。
【Tomcat源码分析】从零开始理解 HTTP 请求处理 (第一篇)
|
7月前
|
Java 应用服务中间件 Apache
使用IDEA修改Web项目访问路径,以及解决Apache Tomcat控制台中文乱码问题
本文介绍了在IntelliJ IDEA中修改Web项目访问路径的步骤,包括修改项目、模块、Artifacts的配置,编辑Tomcat服务器设置,以及解决Apache Tomcat控制台中文乱码问题的方法。
377 0
使用IDEA修改Web项目访问路径,以及解决Apache Tomcat控制台中文乱码问题
|
9月前
|
缓存 负载均衡 NoSQL
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
110 1
|
9月前
|
应用服务中间件
tomcat服务器get、post请求及响应中文乱码问题
tomcat服务器get、post请求及响应中文乱码问题
105 1
|
9月前
|
Java 应用服务中间件 API
Tomcat处理一个HTTP请求的执行流程的详细解析
Tomcat处理一个HTTP请求的执行流程的详细解析
291 4
|
8月前
|
应用服务中间件
tomcat8.5处理get请求时,控制台输出中文乱码问题的解决
tomcat8.5处理get请求时,控制台输出中文乱码问题的解决
80 0
|
9月前
|
应用服务中间件
Tomcat日志中文乱码
Tomcat日志中文乱码
|
Java 应用服务中间件 Android开发
Tomcat在处理GET和POST请求时产生的乱码问题
本文为原创,如需转载,请注明作者和出处,谢谢     有个朋友写JSP程序时,在Servlet中取请求参数时出现了乱码,当然,这种乱码问题再简单不过了。
1067 0
|
18天前
|
网络协议 Java 应用服务中间件
框架源码私享笔记(01)Tomcat核心架构功能 | 配置详解
本文首先分享了《活出意义来》一书序言中的感悟,强调成功如同幸福,不是刻意追求就能得到,而是全心投入时的副产品。接着探讨了Tomcat的核心功能与架构解析,包括网络连接器(Connector)和Servlet容器(Container),并介绍了其处理HTTP请求的工作流程。文章还详细解释了Tomcat的server.xml配置文件,涵盖了从顶级容器Server到子组件Connector、Engine、Host、Context等的配置参数及作用,帮助读者理解Tomcat的内部机制和配置方法。