原文地址: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");
这样很多特殊字符就可以了。