2014-05-13 5 views
0

Au printemps, je mis quelques biscuits j'ai besoin pour mon websocket:Websocket Handshake - le cookie ne peut pas être analysé?

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

Mais quand je lis l'en-tête de la poignée de main WebSocket, la valeur du champ cookie ne se compose que d'une chaîne qui ressemble à ceci:

Lorsque vous essayez d'analyser cette valeur par HttpCookie.parse();, le HTTPCookie essaie d'identifier la version du cookie.
session=foobar; scrt=foomart 

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

Si la valeur est 0, ce qui est faux, mais le cas ici, le HttpCookie n'analysera la première entrée. Si vous forcez la version à 1, cela ne fonctionnera pas non plus, puisque HttpCookie attend des valeurs séparées par des virgules.

Est-il possible de résoudre ce problème en écrivant mon propre analyseur?

Répondre

0

C'est drôle parce qu'un cookie n'a plus de "version" de champ. Je peux trouver une référence dans le RFC2109 (1997), mais ce n'est plus le cas dans RFC6265 (2011). En fait, l'API cookie dans .NET ne fournit pas de méthode intégrée pour définir une telle propriété (c'est la raison pour laquelle cela a attiré mon attention). Vérifiez que le navigateur envoie effectivement ces données dans le cadre de la négociation, peut-être que le navigateur l'ignore.

+0

Oui, l'en-tête de cookie contient uniquement 'session = foobar; scrt = foomart'. Mais alors HttpCookie.parse() ne fonctionne pas correctement, n'est-ce pas? – Goot

+0

Je ne sais pas comment java le gère, le cas est que "version" ne fait plus partie de la spécification. Êtes-vous sûr d'utiliser la bonne version de Java? – vtortola

+0

Que voulez-vous dire par "version java droite"? Je cours 1.7.0_17. – Goot

Questions connexes