Websocket 握手 - 无法解析 cookie?



在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并没有提供一个内置的方法来设置这样的属性(这就是引起我注意的原因)。检查浏览器是否将该数据作为握手的一部分发送,或者浏览器是否忽略了它

相关内容

  • 没有找到相关文章