2011-11-29 51 views
1

設置多個Cookie我有以下簡單的測試代碼在我的服務器HTTP處理程序:Netty的 - 不能與一個CookieEncoder

String cookieString = request.getHeader(COOKIE); 

if (cookieString != null) { 
    CookieDecoder cookieDecoder = new CookieDecoder(); 
    Set<Cookie> cookies = cookieDecoder.decode(cookieString); 

    if (!cookies.isEmpty()) { 
     CookieEncoder cookieEncoder = new CookieEncoder(true); 

     for (Cookie cookie : cookies) { 
      System.out.println("---> " + cookie); 
      cookieEncoder.addCookie(cookie); 
     } 
     response.addHeader(SET_COOKIE, cookieEncoder.encode()); 
    } 
} else { 
    // set cookie for initial time (just testing) 
    if (true) { 
     CookieEncoder cookieEncoder = new CookieEncoder(true); 

     cookieEncoder.addCookie("key", "value"); 
     cookieEncoder.addCookie("key2", "value2"); 

     response.addHeader(SET_COOKIE, cookieEncoder.encode()); 
    } else { 
     CookieEncoder cookieEncoder1 = new CookieEncoder(true); 
     CookieEncoder cookieEncoder2 = new CookieEncoder(true); 

     cookieEncoder1.addCookie("key", "value"); 
     cookieEncoder2.addCookie("key2", "value2"); 

     response.addHeader(SET_COOKIE, cookieEncoder1.encode()); 
     response.addHeader(SET_COOKIE, cookieEncoder2.encode()); 
    } 
} 

正如你所看到的,最初的時候,我嘗試設置兩個虛擬餅乾。當我在FF中刷新頁面(因此客戶端傳遞cookie)(也發生在IE和Chrome中)時,只有一個cookie位於請求的標題中並打印出來。但是,如果我使用單獨的CookieEncoder設置兩個Cookie(請參閱上面的代碼片段中的false-clause),則一切都按預期工作。

這是預期的行爲?我希望你可以用一個CookieEncoder設置多個cookie?

+0

我相信這是'CookieEncoder'或'CookieDecoder'中的一個錯誤。你能否[請提出問題](https://github.com/netty/netty/issues)? – trustin

+0

好吧,我會提交一個錯誤。 –

回答

1
// Initialize Variables 
ArrayList<String> cookieArray = new ArrayList<String>(); 

// Encode 'cooke1' to 'response' Header 
encoder.addCookie(cookie1); 

// Append 'cookie1' to 'cookieArray' 
cookieArray.add(encoder.encode()); 

// Encode 'cooke2' to 'response' Header 
encoder.addCookie(cookie2); 

// Append 'cookie2' to 'cookieArray' 
cookieArray.add(encoder.encode()); 

// Create Cookies using 'cookieArray' 
response.setHeader("Set-Cookie", cookieArray); 
0

這實際上是違反HTTP cookie規範,在Set-Cookie標頭中設置多個cookie。您必須根據Set-Cookie標題僅編碼一個cookie。

Netty的CookieEncoder允許這樣做,它會生成不符合標準的Set-Cookie標頭。

要解決這個問題,如果用戶試圖在服務器模式下編碼多個cookie,下一個版本的Netty將拋出IllegalStateException