java.io.CharConversionException: isHexDigit 出现错误的原因及其解决办法

来源:互联网 发布:mac android 文件传输 编辑:程序博客网 时间:2024/04/25 23:54

   http://wiki.jteam.cn/bin/view/Main/Tomcat-isHexDigit-Exception

   Tomcat 5.526 下ajax提交数据发生如下错误:

   java.io.CharConversionException: isHexDigit

 

    根据这个错误提示,看了下Tomcat源码,发现是因为 org.apache.tomcat.util.http.Parameters 中不能对客户端传过来的数据进行解码。

   Tomcat 的解码 是按照Server.xml中设定编码进行解码。

    Connector port="8081" maxHttpHeaderSize="8192" URIEncoding="GBK"

  (说明:为了保证Tomcat 在Get 和Post 都能正确解析汉字,建议都设置成 GBK 编码 ,当然如果是针对Goolge 的搜索引擎,那就要改成UTF-8了,这个有时间说)
  

   那现在要解决这个问题,一个是改变 客户端的编码, 一个是改变 服务器端的 解码。

   先来看看客户端的情况,客户端是在jQuery ajax 提交数据的时候发生错误,jquery的客户端数据是采用 encodeURIComponent () 进行的编码。

    由于之前都是采用Resin 服务器,采用这个函数后在  Resin的服务器里汉字不能正确显示,为了保证resin 中的汉字正常,将这个函数换成 escape 函数即可。   

   escape 编码之后的汉字 格式为 %uxxxx ,显然这种传到Tomcat之后就不能正确解码了。

   如果是改变客户端的编码,势必造成resin 下又无法显示汉字了,不能两全其美。现在只有一条路了,改变服务器的编码。于是决定对Tomcat 加个Patch。

   下载Tomcat 源码,建立编译环境,修改 Parameters 类,(省去步骤N步)。

    修改的关键地方就是

      tmpName.setBytes( _name.getBytes(), 0, _name.getBytes().length );
      tmpValue.setBytes( _value.getBytes(), 0, _value.getBytes().length);

    在传到底层之前,判断一下是否为 %uxxx 这种格式,然后进行 uescape 再 传到底层就正常了。

     附件是 Patch 的源码 和编译类, 覆盖到 server/classes 即可。

    

      点击这里下载。


     这个方案 保证了 resin 和 Tomcat 下的 ajax 提交都不会出现汉字问题。 如果你有更好的方案,请告诉我。

原创粉丝点击