2010-06-07 35 views
11

J'essaie de définir l'indicateur httponly sur le cookie JSESSIONID. Je travaille en Java EE 5, cependant, et je ne peux pas utiliser setHttpOnly(). J'ai d'abord essayé de créer mon propre cookie JSESSIONID depuis le doPost() du servlet en utilisant response.setHeader().Définition de httponly dans le cookie JSESSIONID (Java EE 5)

Lorsque cela n'a pas fonctionné, j'ai essayé response.addHeader(). Cela n'a pas fonctionné non plus. Ensuite, j'ai appris que la servlet traitait la conversion de la session en un cookie JSESSIONID et l'insérait dans l'en-tête http, donc si je veux jouer avec ce cookie, je vais devoir écrire un filtre. J'ai écrit un filtre et joué avec setHeader()/addHeader() là, encore une fois en vain.

Ensuite, j'ai appris qu'il y avait une action de flush/close dans l'objet de réponse avant qu'il n'atteigne le filtre, donc si je veux manipuler les données, je dois étendre HttpServletResponseWrapper et passer à filterChain.doFilter(). C'est fait, mais je n'obtiens toujours pas de résultats. Clairement je fais quelque chose de mal mais je ne sais pas quoi.

Je ne sais pas si cela est en rapport avec la question en question, mais aucun document HTML n'est retourné par le servlet au navigateur. Tout ce qui se passe réellement, c'est que certains objets sont remplis et retournés dans un document JSP. J'ai en quelque sorte supposé que l'objet Session est transformé en un cookie JSESSIONID et enveloppé - avec les objets ajoutés à la demande - dans un en-tête http avant d'être envoyé au navigateur.

Je serais ravi de poster un code, mais je veux exclure la possibilité que mes difficultés proviennent d'un malentendu de la théorie en premier.

+0

Ajout de formatage du code parce que othe C'était un peu un mur de texte inaccessible. Pensez toujours à poster un exemple de code de ce que vous avez essayé. –

Répondre

10

Étant donné que le cookie JSESSIONID est géré par le servletcontainer, ce paramètre est spécifique au servletcontainer. La réponse ciblée Apache Tomcat 6.0 n'est pas claire. Vous saurez ainsi dans quelle direction vous devrez rechercher votre conteneur servlet: vous devez définir l'attribut useHttpOnly de l'élément <Context> de l'application Web sur true.

<Context useHttpOnly="true"> 
    ... 
</Context> 

Voir aussi ce Tomcat documentation sur l'élément <Context>.

+0

Plus j'explore ce sujet, plus je me rends compte à quel point je suis totalement ignorant de presque tout. J'utilise JBOSS 4.0 mais, d'après ce que j'ai préparé, JBOSS est un conteneur EJB (?). Je ne suis pas sûr de ce que servletcontainer j'utilise. Je devrais poster à nouveau quand j'ai découvert ce que mon servletcontainer est. – Mythandros

+0

JBoss est un serveur d'applications. Il utilise Tomcat comme conteneur de servlet et ajoute des fonctionnalités EJB et autres fonctionnalités JavaEE sophistiquées. L'histoire d'EJB n'est pas pertinente ici. C'est un problème HTTP/Servlet. En passant, je ne suis pas sûr que l'ancien JBoss 4.0 supporte cet attribut ... Au moins, les instructions sont les mêmes que pour Tomcat. – BalusC

+0

Il semble que même JBoss 4.3 ne supporte pas cela, vous aurez besoin de 5.0: https: // problèmes.jboss.org/browse/JBPAPP-3088 –

5

Vous pouvez l'utiliser avec Java EE 5:

Pour Java Enterprise versions Édition avant Java EE 6 une solution commune consiste à remplacer l'en-tête de réponse HTTP SET-COOKIE avec une valeur de cookie de session qui ajoute explicitement l'HttpOnly drapeau:

String sessionid = request.getSession().getId(); 
// be careful overwriting: JSESSIONID may have been set with other flags 
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly"); 

Source: https://www.owasp.org/index.php/HttpOnly

-je tester dans un filtre