当前位置: 代码迷 >> J2EE >> TOMCAT BUG charset.decode();字符丢失!
  详细解决方案

TOMCAT BUG charset.decode();字符丢失!

热度:539   发布时间:2016-04-22 00:18:31.0
求助 TOMCAT BUG charset.decode();字符丢失!!!
本帖最后由 nstones 于 2012-11-21 15:55:13 编辑 public class TestTomcatBug {

public static final Charset charset  = new EUC_CN();
//public static final Charset charset  = new ISO_8859_11();

/**
 * @param args
 * @throws Exception 
 */
public   static   void   main(String[]   args) throws Exception{ 

byte [] buff = new byte[8192];
byte [] temp = {102, 117, 110, 99, 116, 105, 111, 110, 76, 101, 118, 101, 108, 61, 38, 105, 100, 61, 76, 81, 49, 55, 48, 57, 38, 112, 97, 115, 115, 119, 111, 114, 100, 61, 88, 38, 120, 61, 49, 53, 38, 121, 61, 55};
System.arraycopy(temp, 0, buff, 0, temp.length);
CharBuffer cb;
ByteBuffer bb;
bb = ByteBuffer.wrap(buff, 34, 1);
        cb = charset.decode(bb);
        System.out.println(new String(cb.array(), cb.arrayOffset(), cb.length()));
}
}

运行以上小程序
对数组里面的第34个字符进行 DECODE
当CHARSET 为ENC_CN 时 DECODE结果为空字符串:
输出:空字符串(字符X丢失) 
而换做ISO_8859_11时 DECODE结果为 X 
输出字符 X
这个程序是我从tomcat源码中截取出来的.
项目测试账号一直使用位数为一的密码,传入后老是报密码为空的错误.
DEBUG 后得知密码传入后台变为空字符串,
步步跟踪tomcat源码得出
就是以上几个步骤导致密码丢失.拿出来单独测试,同样是丢失.
请教了!(tomcat5.5.36,tomcat6都有此问题)
------最佳解决方案--------------------
已经找到问题原因了
jdk 版本需要6.0以上

TOMCAT 官方文档说5.5版本至少需要jdk5.0
所以之前没有用6.0测试,今天突然想起来了,下载一个6.0测试了以上代码
可以正常decode出X

TOMCAT 5.5.36 这个版本在使用JDK5.0版本的时候 会丢失位数为1的字符
解决办法:
1:降低TOMCAT版本,目前使用 TOMCAT 5.5.33 无此问题
2:升级JDK 到6.0.370.6 版本(测试通过)其他版本未测试

结贴了!
------其他解决方案--------------------
null
  相关解决方案