Cookie编程问题及Base64中文编码问题

原文地址:http://www.blogjava.net/persister/archive/2009/10/02/297103.html


调用Cookie对象的构造函数可以创建Cookie。Cookie对象的构造函数有两个字符串参数:Cookie名字和Cookie值。

Cookie cookie = new Cookie(name,value);

调用下面的方法时出现一个问题
response.addCookie(cookie);//cookie 是一个Cookie实例

问题报错:java.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value

很显然Cookie之中存在了非法参数,经过测试发现cookie之中包含""r"n"、""n"时就会出现这个异常。

因为cookie中部分值是通过文本框录入的,在<textarea/>标签中键入回车键后,value值中就加入了""r"n",
把这样的值赋给cookie,执行response.addCookie(cookie);时则出现异常。

解决办法:使用String类的replace()方法。
Java代码

1 str = str.replace(""r"n", "<br>");            
2 str = str.replace(""n", "<br>");
3 
4 Cookie cookie = new Cookie('cookName',str);
5 //永久有效
6 cookie.setMaxAge(60*60*24*365);
7 response.addCookie(cookie);


刚才看到Base64错误,通常不将数据直接保存在cookie中,而要进行Base64编码

String cookieValueBase64 = new String(Base64.encode(cookieValue.getBytes("UTF-8"))); //设置UTF-8否则会乱码
Debug.log("Ba64:"+ cookieValueBase64, module);
cookieValueBase64 = cookieValueBase64.replace(""r"n", "");              
cookieValueBase64 = cookieValueBase64.replace(""n", "");
Cookie cookie = new Cookie(key, cookieValueBase64);
cookie.setMaxAge(time);
cookie.setPath("/");// 设置適用路经
res.addCookie(cookie);// 将cookie添加到response对象中。由response对象返回给户端  



取得时候:new String(Base64.decode(ck.getValue()),"UTF-8");       

这样做就行了吗?发现还是不够,出现什么问题呢?
原来如果cookie值中出现等号,那么取出来的值只取等号前面的值,等号及等号后面的值会被忽略

Base64编码难保不出现等号,怎么解决呢?采用UrlEncoder和UrlDecoder,存的时候:

String cookieValueBase64 = new String(Base64.encode(cookieValue.getBytes("UTF-8")));
cookieValueBase64 = cookieValueBase64.replace(""r"n", "");              
cookieValueBase64 = cookieValueBase64.replace(""n", "");     
String cookieValueUrlEncode = URLEncoder.encode(cookieValueBase64, "UTF-8");


取的时候:

new String(Base64.decode(URLDecoder.decode(ck.getValue(), "UTF-8")),"UTF-8");

这样很多特殊字符就可以了。


转载于:https://my.oschina.net/kelvinline/blog/380881

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值