Netty - 无法使用一个CookieEncoder设置多个Cookie

时间:2011-11-29 14:16:39

标签: java cookies netty

我在服务器http处理程序中有以下简单的测试代码:

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());
    }
}

如您所见,我尝试设置两个虚拟Cookie的初始时间。当我在FF中刷新页面(因此cookie由客户端传递)时(在IE和Chrome中也会发生),请求的标题中只有一个cookie并打印出来。

但是,如果我使用单独的CookieEncoder设置两个cookie(请参阅上面代码片段中的false-clause),一切都按预期工作。

这是预期的行为吗?我希望你可以用一个CookieEncoder设置多个cookie吗?

3 个答案:

答案 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);

答案 1 :(得分:1)

Set-Cookie标头中设置多个Cookie实际上违反了HTTP cookie规范。您必须每Set-Cookie个标头只编码一个Cookie。

Netty的CookieEncoder允许这样做,并且它生成了不合规的Set-Cookie标头。

要解决此问题,如果用户尝试在服务器模式下编码多个cookie,则下一版本的Netty将抛出IllegalStateException

答案 2 :(得分:0)

我正在回答我自己的问题,因为它似乎是一个问题。请参阅https://github.com/netty/netty/issues/94