2010-06-07 10 views
11

Próbuję ustawić flagę httponly na pliku cookie JSESSIONID. Pracuję jednak w Java EE 5 i nie mogę używać setHttpOnly(). Najpierw próbowałem utworzyć własny plik cookie JSESSIONID z poziomu doPost() serwletu za pomocą response.setHeader().Ustawienie httponly w pliku cookie JSESSIONID (Java EE 5)

Kiedy to nie zadziałało, próbowałem response.addHeader(). To też nie działa. Potem dowiedziałem się, że serwlet wykonał konwersję sesji na plik cookie JSESSIONID i wstawił go do nagłówka http, więc jeśli chcę grać z tym plikiem cookie, będę musiał napisać filtr. Napisałem filtr i grałem tam z setHeader()/addHeader(), znowu bez skutku.

Następnie dowiedziałem się, że w obiekcie odpowiedzi jest wykonywana operacja przepłukiwania/zamykania, zanim dotrze ona do filtra, więc jeśli chcę manipulować danymi, muszę przedłużyć HttpServletResponseWrapper i przekazać to do filterChain.doFilter(). Odbywa się to, ale nadal nie osiągam wyników. Najwyraźniej robię coś złego, ale nie wiem co.

Nie jestem pewien, czy jest to w ogóle istotne dla danego pytania, ale żaden aplet HTML nie jest zwracany przez serwlet do przeglądarki. Wszystko, co się naprawdę dzieje, to to, że niektóre obiekty są zapełniane i zwracane do dokumentu JSP. W pewnym sensie założyłem, że obiekt Sesji jest przekształcany w plik cookie JSESSIONID i zawijany - wraz z obiektami dodanymi do żądania - w nagłówku http przed wysłaniem do przeglądarki.

Z przyjemnością opublikuję kod, ale chcę wykluczyć, że moje trudności wynikają z niezrozumienia teorii.

+0

dodano kilka kod formatowania ponieważ othe rwise to było trochę niedostępne Wall Of Text. Może nadal rozważać opublikowanie przykładowego kodu, którego próbujesz. –

Odpowiedz

10

Ponieważ cookie JSESSIONID jest zarządzane przez servletcontainer, to ustawienie jest specyficzne dla servletcontainer. Nie jest jasne, którego z nich używasz, więc tutaj jest ukierunkowana odpowiedź, dzięki której wiesz, w którym kierunku będziesz musiał szukać swojego servletcontainer: musisz ustawić atrybut useHttpOnly elementu webapplication na <Context> na true.

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

zobaczyć także ten Tomcat documentation o elemencie <Context>.

+0

Im więcej badam ten temat, tym bardziej uświadamiam sobie, jak całkowicie nieświadomym jestem o prawie wszystkim. Używam JBOSS 4.0, ale z tego, co mam gotowy, JBOSS jest kontenerem EJB (?). Nie jestem pewien, którego servletcontainer używam. Będę musiał wysłać ponownie, gdy dowiem się, co to jest mój kontener servlet. – Mythandros

+0

JBoss jest serwerem aplikacji. Używa Tomcat jako kontener serwletu i dodaje niektóre EJB i inne wymyślne funkcje JavaEE. Historia EJB jest tutaj nieistotna. To jest problem HTTP/serwletu. Nawiasem mówiąc, nie jestem pewien, czy stary JBoss 4.0 obsługuje ten atrybut ... Przynajmniej instrukcje są takie same jak dla Tomcat. – BalusC

+0

Wygląda na to, że nawet JBoss 4.3 tego nie obsługuje, potrzebujesz problemów z wersją 5.0: https: //.jboss.org/browse/JBPAPP-3088 –

5

Można to wykorzystać z Java EE 5:

Dla wersji Java Enterprise Edition przed Java EE 6 częstym rozwiązaniem jest zastąpienie nagłówka odpowiedzi HTTP SET-ciasteczka z wartością cookie sesji, które wyraźnie dołącza HttpOnly Flaga:

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

Źródło: https://www.owasp.org/index.php/HttpOnly

przetestować go w filtrze

Powiązane problemy