Websocket握手 - cookie无法解析?

时间:2014-05-13 23:38:07

标签: java cookies websocket

在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)

有没有办法解决这个问题但是编写自己的解析器?

1 个答案:

答案 0 :(得分:0)

这很有趣,因为cookie不再有字段“version”了。我可以在RFC2109 (1997)中找到对它的引用,但RFC6265 (2011)中不再存在。实际上,.NET中的cookie API没有提供内置方法来设置这样的属性(这就是引起我注意的原因)。检查浏览器是否实际上是在握手过程中发送数据,也许是浏览器忽略它。