关于Tomcat的URIEncoding以及GET乱码

来源:互联网 发布:缅甸听音乐的软件 编辑:程序博客网 时间:2024/05/01 06:31

http://blog.csdn.net/renfufei/article/details/11294917

最近在维护着Linux上的服务器,当然,开发和前期测试是在windows上执行的。

在做意见反馈的时候,出现了windows上正常,Linux下却是乱码的问题。

先排查了web服务器与MySQL的连接,确认问题处在前端页面和web之间的乱码交互。

前端的代码如下:是jQuery的跨域提交。

[javascript] view plain copy
  1. $(function(){  
  2.     //  
  3.     var $btn_green = $(".btn_green");  
  4.     var $content = $(":input[name=content]");  
  5.     var $nickname = $(":input[name=nickname]");  
  6.     var $linktel = $(":input[name=linktel]");  
  7.     //  
  8.     $btn_green.click(function(){  
  9.         //  
  10.         var content = $content.val();  
  11.         var nickname = $nickname.val();  
  12.         var linktel = $linktel.val();  
  13.         //  
  14.         if(!content){  
  15.             show("亲,请填写内容哦!");  
  16.             $content.focus();  
  17.             return false;  
  18.         }  
  19.         //  
  20.         var url = "http://dev3.mywebsite.com:80/api/feedback?";  
  21.         url += "content="+encodeURIComponent(content);  
  22.         url += "&nickname="+encodeURIComponent(nickname);  
  23.         url += "&linktel="+encodeURIComponent(linktel);  
  24.         try{  
  25.             $.getScript(url);  
  26.         } catch(e){  
  27.             //  
  28.         }  
  29.         close_feedback();  
  30.         $content.val("");  
  31.         //  
  32.         show("感谢您的建议与反馈!");  
  33.     });  
  34.     //  
  35.     function show(message){  
  36.         if(message){  
  37.             alert(message);  
  38.         }  
  39.     };  
  40. });  


页面编码是UTF-8。 提交以后,在servlet里面:

[java] view plain copy
  1. // 请求的编码  
  2. request.setCharacterEncoding("UTF-8");  
  3.   
  4. String content = request.getParameter("content");  
  5. String clientIp = request.getRemoteAddr();  
  6. String nickName = request.getParameter("nickname");  
  7. String linkTel = request.getParameter("linktel");  
  8. // 打印其中一个内容  
  9. System.out.println("content="+content);  

发现在windows上是正常的,而linux服务器里面就是乱码。

于是在Servlet加上转码,linux好了,而windows又出现乱码了。

[java] view plain copy
  1. String srcChar = "ISO8859-1";  
  2. String dstChar = "UTF-8";  
  3. title = new String(title.getBytes(srcChar),dstChar);  
  4. content = new String(content.getBytes(srcChar),dstChar);  
  5. nickName = new String(nickName.getBytes(srcChar),dstChar);  
  6. linkAddress = new String(linkAddress.getBytes(srcChar),dstChar);  
  7. //  

确定问题应该处在Tomcat的配置上,于是翻开两个conf/server.xml 对比,发现:

[html] view plain copy
  1. <!-- windows  -->  
  2. Service name="Catalina">  
  3. <Connector port="8080" protocol="HTTP/1.1"   
  4.            connectionTimeout="20000"   
  5.            redirectPort="8443" URIEncoding="UTF-8" />  
  6.   
  7. <Connector port="8099" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />  

而Linux 的配置缺少了URIEncoding的配置项,那么默认应该是"ISO8859-1",所以如果没有配置,则需要转码一次。

[html] view plain copy
  1. <!-- Linux 上Tomcat-->  
  2. <Service name="Catalina">  
  3.   <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"  maxThreads="250" minSpareThreads="20"/>  
  4.   <Connector port="80" protocol="HTTP/1.1"  
  5.              connectionTimeout="20000"  redirectPort="8443"  compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla,traviata"  
  6. ompressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,application/json,application/javascript,application/x-javascript"  
  7.         />  
  8.   <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" executor="tomcatThreadPool"/>  

同理,如果在Linux上的Tomcat 加上URIEncoding="UTF-8" 就好了。

结论: 约定很重要,网站一般采用UTF-8作为默认编码。如果不是特殊需求,不要变换成其他编码。




0 0