Question

J'ai le code de test simple suivant à mon serveur http gestionnaire:

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

Comme vous pouvez le voir, le temps initial que j'essaie de définir deux cookies factices. Quand j'actualisez la page (si le cookie est passé à travers par le client) dans FF (ne se produit également dans IE et Chrome), un seul cookie est dans l'en-tête de la demande et imprimé.

Cependant, si je mets les deux biscuits avec un séparé CookieEncoder (voir faux article dans l'extrait de code ci-dessus), tout fonctionne comme prévu.

Est-ce comportement attendu? Je me attends à ce que vous pouvez définir plusieurs cookies avec un CookieEncoder?

Était-ce utile?

La solution 3

Je réponds à ma propre question, car il semble être un problème. Voir https://github.com/netty/netty/issues/94 .

Autres conseils

// 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);

Il est en fait une violation de la spécification HTTP cookies à placer des cookies multiples dans un en-tête de Set-Cookie. Vous devez coder un seul biscuit par tête de Set-Cookie.

CookieEncoder Netty a permis de faire cela et il a généré des en-têtes de Set-Cookie non conformes.

Pour résoudre ce problème, la prochaine version de Netty lancera une IllegalStateException si un utilisateur tente d'encoder plus d'un cookie en mode serveur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top