Control character in cookie value or attribute

客官°小女子只卖身不卖艺 2023-05-31 12:28 145阅读 0赞

先说一下环境 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是我加密的算法,用于给用户名加密,难道是我加密后的字符串再转码出问题?然后我把我代码修改成,先加密,后转码

  1. username = username.trim();
  2. username = EncryptionCoder.EncryptedCookie(username); //加密
  3. username=URLEncoder.encode(username,"UTF-8"); //转码

在页面取出时,就先解码,后解密

  1. Cookie[] cookies = request.getCookies();
  2. if(cookies!=null){
  3. for(Cookie cookie:cookies){
  4. if("userName".equals(cookie.getName())){
  5. username = cookie.getValue().trim(); //得到值
  6. username = URLDecoder.decode(username,"UTF-8"); //解码
  7. username = EncryptionCoder.DecryptCookie(username);//解密
  8. }
  9. }
  10. }

问题就这样解决了!
问题是解决了,可是出现这个情况的原因是什么呢?
我之前产生这个问题的原因是,我先进行了转码,然后再去加密;现在的顺序是,我先进行了加密,然后在进行转码
两者的区别在于先加密,转码的先后!
明白了这里以后,我把两种操作后,得到结果进行了对比,
第一种,先转吗,加密,YWRtaW4z\r\n
第二种,先加密,后转码YWRtaW4z%0D%0A
结果就是,第二种可以成功执行,第一种,无法执行
所以以后,在对字符需要进行加密,解密,转码,解码操作时,如果碰到了类似情况,可以尝试吧顺序换一下!

原文:https://my.oschina.net/gavinnie/blog/313461

发表评论

表情:
评论列表 (有 0 条评论,145人围观)

还没有评论,来说两句吧...

相关阅读