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");

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


你可能感兴趣的:(Cookie编程问题及Base64中文编码问题)