在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;
}
如果值为0,这是错误的,但这里的情况,HttpCookie将只解析第一个条目。
如果强制版本为1,则这也不起作用,因为HttpCookie期望逗号分隔值。 splitMultiCookies(String header)
有没有办法解决这个问题但是编写自己的解析器?
答案 0 :(得分:0)
这很有趣,因为cookie不再有字段“version”了。我可以在RFC2109 (1997)中找到对它的引用,但RFC6265 (2011)中不再存在。实际上,.NET中的cookie API没有提供内置方法来设置这样的属性(这就是引起我注意的原因)。检查浏览器是否实际上是在握手过程中发送数据,也许是浏览器忽略它。