Netty - не может установить несколько файлов cookie с одним cookieEncoder
Вопрос
У меня есть следующий простой тестовый код на моем сервере HTTP Handler:
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 (также происходит в IE и Chrome), только один файл cookie находится в заголовке запроса и распечатано.
Однако, если я установите два файла cookie с отдельным cookieEncoder (см. False-Clease в фрагменте кода выше), все работает как ожидалось.
Это ожидаемое поведение? Я ожидаю, что вы сможете установить несколько файлов cookie с одним печеньем?
Решение 3
Я отвечаю на свой собственный вопрос, так как это кажется проблемой. Видеть https://github.com/netty/netty/issues/94.
Другие советы
// 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);
На самом деле это нарушение спецификации HTTP Cookie для установки нескольких файлов cookie в Set-Cookie
заголовок. Вы должны кодировать только один файл cookie на Set-Cookie
заголовок.
CookieEncoder's Netty позволил сделать это, и он породил несоответствующий Set-Cookie
заголовки.
Чтобы решить эту проблему, следующая версия Netty выбросит IllegalStateException
Если пользователь пытается кодировать более одного файла cookie в режиме сервера.