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 提交都不会出现汉字问题。 如果你有更好的方案,请告诉我。