先说一下环境 tomcat7,jdk7
在做一个cookie保存账号的时候报这个错,各种google,baidu后,大家基本都归结于转码的问题,然后我在我代码中,添加了存储cookie时,转码username=URLEncoder.encode(username,“UTF-8”); 在取出cookie时候,解码username = URLDecoder.decode(username,“UTF-8”),并且设置tomcat的编码为utf-8,可惜问题依旧;
后来看到网友说,tomcat7对中文支持不好,然后我下载了一个tomcat6,吧程序跑了起来,发现报错换了!!!就是这个报错,让我解决了问题…
现在的运行环境是:tomcat6 jdk7
我吧程序跑了起来,发现tomcat6也是无法运行,可以报的错是:Control character in cookie value, consider BASE64 encoding your value
,看到base64后,我产生了疑问,base64是我加密的算法,用于给用户名加密,难道是我加密后的字符串再转码出问题?然后我把我代码修改成,先加密,后转码
username = username.trim();
username = EncryptionCoder.EncryptedCookie(username); //加密
username=URLEncoder.encode(username,"UTF-8"); //转码
在页面取出时,就先解码,后解密
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for(Cookie cookie:cookies){
if("userName".equals(cookie.getName())){
username = cookie.getValue().trim(); //得到值
username = URLDecoder.decode(username,"UTF-8"); //解码
username = EncryptionCoder.DecryptCookie(username);//解密
}
}
}
问题就这样解决了!
问题是解决了,可是出现这个情况的原因是什么呢?
我之前产生这个问题的原因是,我先进行了转码,然后再去加密;现在的顺序是,我先进行了加密,然后在进行转码
两者的区别在于先加密,转码的先后!
明白了这里以后,我把两种操作后,得到结果进行了对比,
第一种,先转吗,加密,YWRtaW4z\r\n
第二种,先加密,后转码YWRtaW4z%0D%0A
结果就是,第二种可以成功执行,第一种,无法执行
所以以后,在对字符需要进行加密,解密,转码,解码操作时,如果碰到了类似情况,可以尝试吧顺序换一下!