设为首页 收藏本站
查看: 1271|回复: 0

[经验分享] Tomcat 中 GET方式 请求 中文乱码 出现的原因

[复制链接]

尚未签到

发表于 2018-12-1 08:51:09 | 显示全部楼层 |阅读模式
   网上很多关于GET方式请求中文乱码的解决方案,大体类似. 这里主要讲一下Tomcat在处理URL参数过程中,  究竟是为什么会导致了GET方式请求的中文乱码. 一句话概括就是:  Tomcat默认将单字节作为一个字符,但是中文是2个字节表示一个字符....
  首先来一个Tomcat解析URL中参数的序列图,其中阴影部分就是造成乱码的地方.
  http://blog.运维网.com/attachment/201203/164340565.jpg
  测试场景:
  对于一个从官方下载的Tomcat6,不去任何配置.(这里强调不去任何配置主要是指不在Tomcat的server.xml文件中作任何修改.)
  在Tomcat的 webapps/ROOT目录下新建一个test.jsp:











  然后发起这样一个请求  http://localhost:8080/test.jsp?name=ni%D5%C6%B9%F1
  
    (真实面目是:http://localhost:8080/test.jsp?name=ni掌柜  )
  
  接着我们定位到上面阴影部分的代码:




  • private String urlDecode(ByteChunk bc, String enc)
  •         throws IOException {
  •         if( urlDec==null ) {
  •             urlDec=new UDecoder();   
  •         }
  •         urlDec.convert(bc); //这个方法影响不大,只是对那个java.net.URLEncod...编码的进行处理.
  •         String result = null;
  •         if (enc != null) {
  •             //关键问题:如果这里没有指定URIEncoding的话, 那么enc是null
  •             bc.setEncoding(enc);
  •             result = bc.toString();
  •         }  
  •         //这个地方如果没有配置URIEncoding,那么走else的流程,所以就会按照字节来
  •         else {
  •             CharChunk cc = tmpNameC;
  •             int length = bc.getLength();
  •             cc.allocate(length, -1);
  •             // Default encoding: fast conversion
  •             byte[] bbuf = bc.getBuffer();
  •             char[] cbuf = cc.getBuffer();
  •             int start = bc.getStart();
  •             for (int i = 0; i < length; i++) {
  •                 cbuf = (char) (bbuf[i + start] & 0xff);
  •             }
  •             cc.setChars(cbuf, 0, length);
  •             result = cc.toString();
  •             cc.recycle();
  •         }
  •         return result;
  •     }


      在运行过程中可以看到, 到进入这个方法的时候,还没有乱码  :
  然后是到urlDec.convert(bc);

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

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

  那么进入了else代码段.

  这一进入就完了,可以看到他的处理是按单字节作为一个字符, 于是上面的 &quot;ni%D5%C6%B9%F1&quot; 在它眼里就是6个字符了 .(实际上 ni掌柜 是4个字符),  所以显然就是乱码. 如下:
  http://blog.运维网.com/attachment/201203/164553465.jpg
  那么在server.xml文件中设置了URIEncoding, 比如: URIEncoding=&quot;GBK&quot;.  于是在上面代码中,就会进入下面代码段:


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

   如下:
  http://blog.运维网.com/attachment/201203/164638177.jpg


  




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-641798-1-1.html 上篇帖子: Myeclipse启动Tomcat服务器Address already in use: JVM_Bind 下篇帖子: tomcat变量环境脚本setclasspath.sh分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表