博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cookie编程问题及Base64中文编码问题
阅读量:6538 次
发布时间:2019-06-24

本文共 1770 字,大约阅读时间需要 5 分钟。

hot3.png

原文地址:

调用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

你可能感兴趣的文章
这里是指推送通知跟NSNotification有区别:
查看>>
用户ID的代码生成
查看>>
win7经常出现“关闭xxxx前您必须关闭所有会话框”
查看>>
SNMP安全配置的两种方法(也可同一时候兼顾配置两种方法)
查看>>
MongoDB 自己定义函数
查看>>
Summary Day30
查看>>
逆向输出回环数组
查看>>
自己动手,实现“你的名字”滤镜
查看>>
高清摄像头MIPI CSI2接口浅解【转】
查看>>
C# CancellationTokenSource和CancellationToken的实现
查看>>
PCIE BAR空间
查看>>
winform命名规范
查看>>
如何用数学课件制作工具画角平分线
查看>>
VS2015 中统计整个项目的代码行数
查看>>
Anaconda入门使用指南
查看>>
UWP控件与DataBind
查看>>
bash: php: command not found
查看>>
XVIII Open Cup named after E.V. Pankratiev. Eastern Grand Prix
查看>>
数据恢复软件如何换机使用?
查看>>
《高性能mysql》到手
查看>>