在Spring中,我为我的websocket设置了一些cookie:
Cookie ck = new Cookie("session", request.getSession().getId());
ck.setDomain(".mydomain.com");
ck.setPath("/");
ck.setVersion(1);
Cookie secretCookie = new Cookie("scrt", secret);
secretCookie.setDomain(".mydomain.com");
secretCookie.setPath("/");
secretCookie.setVersion(1);
response.addCookie(secretCookie);
response.addCookie(ck);
但是当我读取websocket握手的报头时,cookie字段的值只由一个字符串组成,看起来像这样:
session=foobar; scrt=foomart
当您尝试通过HttpCookie.parse();
解析此值时,HTTPCookie将尝试识别cookie的版本。
private static int guessCookieVersion(String header) {
int version = 0;
header = header.toLowerCase();
if (header.indexOf("expires=") != -1) {
// only netscape cookie using 'expires'
version = 0;
} else if (header.indexOf("version=") != -1) {
// version is mandatory for rfc 2965/2109 cookie
version = 1;
} else if (header.indexOf("max-age") != -1) {
// rfc 2965/2109 use 'max-age'
version = 1;
} else if (startsWithIgnoreCase(header, SET_COOKIE2)) {
// only rfc 2965 cookie starts with 'set-cookie2'
version = 1;
}
return version;
}
如果Value是0,这是错误的,但在这里的情况下,HttpCookie将只解析第一个条目。如果你强制版本为1,这也不会工作,因为HttpCookie期待逗号分隔的值。splitMultiCookies(String header)
有什么办法来解决这个问题,但写我自己的解析器?
这很有趣,因为cookie没有"版本"字段。了。我可以在RFC2109(1997)中找到对它的参考,但它在RFC6265(2011)中不再存在。实际上,. net中的cookie API并没有提供一个内置的方法来设置这样的属性(这就是引起我注意的原因)。检查浏览器是否将该数据作为握手的一部分发送,或者浏览器是否忽略了它