2014-05-13 60 views
0

在春天,我設置了一些餅乾我需要爲我的WebSocket: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

這很有趣,因爲cookie沒有字段「版本」了。我可以在RFC2109 (1997)中找到它的參考,但它在RFC6265 (2011)中不存在。實際上,.NET中的Cookie API不提供內置方法來設置這些屬性(這是引起我注意的原因)。檢查瀏覽器是否實際發送數據作爲握手的一部分,也許瀏覽器忽略它。

+0

是的,cookie標頭只包含'session = foobar; SCRT = foomart'。但是,然後HttpCookie.parse()不正確,是嗎? – Goot

+0

我不知道java如何處理它,情況是「版本」不再是規範的一部分。你確定你正在使用正確的Java版本嗎? – vtortola

+0

你是什麼意思「正確的java版本」?我正在運行1.7.0_17。 – Goot