zoukankan      html  css  js  c++  java
  • Tomcat get 中文乱码

    乱码问题

    原因:

    tomcat默认的在url传输时是用iso8859-1编码。

    解决方案一:

    在使用get传输参数时,将参数中的中文转换成url格式,也就是使用urlEncode和urlDecode来传输,使用这种方式就是把中文转换成以%开头的编码在url中传输。

    使用这种方法时,要注意两点。

    1.前台使用urlencode,在后台相应的使用urldecode。

    2.使用urlencode的内容是参数内空。千万要注意,他是会把等于号等符号也给转换了。所以,最好是先把参数传换后再进行拼接。而不是把url拼接好再去转换。

    解决方案二:

    配置tomcat,使用其在url传输过程中使用相应的支持中文的编码。一般国内的喜欢用gbk或gb2312。我个人建议使用utf-8

    在tomcat的/conf/server.xml文件中,找到以下这一行。

    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

    这行的意思也就是使用8080端口来接收html的请求。在这里可以加几个参数来配置不同的效果。

    URIEncoding="UTF-8" 设置url传输时对url内容的编码格式

    compression="on" 打开压缩功能 

    compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB

    noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器,不启用压缩 

    compressableMimeType="text/html,text/xml" 压缩类型

    对于要解决乱码来说,改成以下就行

    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

    转:

    经过分析,使我对TOMCAT的处理机制和HttpServletRequest有了更加深入的认识。

    1.filter过滤器中获取参数值出现乱码

    下面是服务器端中的过滤器获取参数的代码:

    Java代码  收藏代码
    1. public void doFilter(ServletRequest arg0, ServletResponse arg1,  
    2.         FilterChain arg2) throws IOException, ServletException {  
    3.     String foo=arg0.getParameter("foo");  
    4.     System.out.println(foo);  
    5.     arg2.doFilter(arg0, arg1);  
    6. }  

        当我在浏览器输入“http//:localhost:8080/rest/test?foo=中国”时,浏览器会自动对"中国"进行URI转码,由于使 用的中文语言环境,浏览器会将“中国”转码为"%D6%D0%B9%FA"."D6D0","B9FA"分别"中","国"的GBK编码。等价于在 JAVA语言中作了如下操作

    Java代码  收藏代码
    1. URLEncoder.encode("中国","GBK")  

    传递到服务器后的URL实际为“http//:localhost:8080/rest/test?foo=%D6%D0%B9%FA”。

        由于TOMCAT默认会对URL进行解码,并且使用的是ISO-8859-1字符集,如下所示

    Java代码  收藏代码
    1. URLDecoder.decode("%D6%D0%B9%FA","ISO-8859-1");  

     因为编码和解码使用的是不同的字符集,所以解码出来的字符串肯定是不对的,故而使用如下方式获取参数值时出现乱码。

    Java代码  收藏代码
    1. String foo=request.getParameter("foo");  

     2.resteasy的service方法中获取参数出现乱码

    Java代码  收藏代码
    1. @GET  
    2. @Path("/test")  
    3. public void hello10(@QueryParam(value="foo") String foo) {  
    4.     System.out.println(foo);  
    5.   
    6. }     

     resteasy中获取到request参数foo的机制与前面的filter略有不同。foo参数的是值由resteasy框架进行类似如下处理后获得的。

    Java代码  收藏代码
    1. String params=request.getQueryString();  
    2. System.out.println(params);//foo=%D6%D0%B9%FA  
    3. String encodedParams= URLDecoder.decode(params,"UTF-8");  
    4. ......  

     通过getQueryString()方式获得的参数并没有被TOMCAT解码过,但被resteasy框架进行了解码,当传入参数不是以UTF-8编码的话获取到的参数就可能是乱码

    3.总结

    使用request.getParameter方式获得的参数是已经经过web服务器解码的

    使用request.getQueryString可以获得未解码的原始参数

    对于tomcat解码造成的乱码问题可以通过2种途径解决

             修改tomcat配置文件设置解码方式

             服务器端对于获取到的参数进行new String(param.getBytes("ISO-8859-1"),"页面指定编码")转换

  • 相关阅读:
    JDK8新特性
    控制线程同步的方法
    Java面向对象(一)20170517
    Java语言基础-递归
    勒索病毒应对措施
    JAVA application 初步20170515
    JAVA语言基础(二)20170511
    JAVA语言基础(二)20170510
    JAVA学习概述(一)20170508
    我有一个读绘本的妈妈
  • 原文地址:https://www.cnblogs.com/1995hxt/p/4982835.html
Copyright © 2011-2022 走看看