Cookie中特殊字符

话不多说,放码过来

<%String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());Cookie cookie =new Cookie("date",date);response.addCookie(cookie);
%>

jsp页面中加入cookie来记录登录时间,并在下一次访问时获得上一次的登陆时间。

<%Cookie [] cookies = request.getCookies();if (cookies!=null&&cookies.length>0){for (int i = 0; i < cookies.length ;i++) {if ("date".equals(cookies[i].getName())){String cookievalue = cookies[i].getValue();}}}
%>

但是在运行过程中出现了如下错误

在这里插入图片描述
老实说这里的错误折磨了我两个小时,起初我以为另一个页面的请求转发存在问题导致,或者是没有获取到date,或者又是等等其它的一些问题。最终发现了一个及其细微的问题所在。

上例中cookie中放入的是date,也就是获取到的时间的字符串,万万没想到的是这里日期的格式出现了问题,**“yyyy-MM-dd HH:mm.ss”**中在d与H之间有一个空格,这是标准的格式,但是在cookie中,这个空格导致了其无法识别,也就是说,如果输出这个空格后,它是一个乱码。如果将空格删掉或者换成其他符号例如:"-","_",却能顺利编译。

但是在Tomcat7.0的版本中,即使带了空格仍然可以顺利编译,我是用的是8.5的版本,这就说明可能在Tomcat的Cookie中新加入了检索特殊字符的功能,另外,如果中间是全角空格,可以编译通过,半角空格,却不能成功编译。

cookie中对特殊字符的定义如下

package javax.servlet.http;

class RFC6265Validator extends CookieNameValidator {private static final String RFC2616_SEPARATORS = "()<>@,;:\\\"/[]?={} \t";RFC6265Validator() {super("()<>@,;:\\\"/[]?={} \t");}
}
  1. Cookie的兼容性问题

Cookie的格式有2个不同的版本,第一个版本,我们称为Cookie Version 0,是最初由Netscape公司制定的,也被几乎所有的浏览器支持。而较新的版本,Cookie Version 1,则是根据RFC 2109文档制定的。为了确保兼容性,JAVA规定,前面所提到的涉及Cookie的操作都是针对旧版本的Cookie进行的。而新版本的Cookie目前还不被Javax.servlet.http.Cookie包所支持。

  1. Cookie的内容

同样的Cookie的内容的字符限制针对不同的Cookie版本也有不同。在Cookie Version 0中,某些特殊的字符,例如:空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号都不能作为Cookie的内容。这也就是为什么我们在例子中设定Cookie的内容为"yyyy-MM-dd HH:mm:ss"会错误的原因。

虽然在Cookie Version 1规定中放宽了限制,可以使用这些字符,但是考虑到新版本的Cookie规范目前仍然没有为所有的浏览器所支持,因而为保险起见,我们应该在Cookie的内容中尽量避免使用这些字符。

————————————————

参考链接:https://blog.csdn.net/hl_java/article/details/78908423


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部