2010-06-07 8 views
11

Sto tentando di impostare il flag httponly sul cookie JSESSIONID. Tuttavia, sto lavorando in Java EE 5 e non posso utilizzare setHttpOnly(). Per prima cosa ho provato a creare il mio cookie JSESSIONID dal servlet doPost() utilizzando response.setHeader().Impostazione httponly nel cookie JSESSIONID (Java EE 5)

Quando non ha funzionato, ho provato response.addHeader(). Neanche questo ha funzionato. Poi, ho appreso che il servlet gestiva la conversione della sessione in un cookie JSESSIONID e lo inseriva nell'intestazione http, quindi se voglio giocare con quel cookie, dovrò scrivere un filtro. Ho scritto un filtro e ho giocato con setHeader()/addHeader() lì, ancora inutilmente.

Quindi, ho appreso che nell'azione oggetto risposta c'è un'azione di svuotamento/chiusura prima che arrivi al filtro, quindi se voglio manipolare i dati, devo estendere HttpServletResponseWrapper e passarlo a filterChain.doFilter(). Questo è fatto ma non sto ancora ottenendo risultati. Chiaramente sto facendo qualcosa di sbagliato ma non so cosa.

Non sono sicuro che questo sia pertinente per la domanda in questione, ma nessun documento html viene restituito dal servlet al browser. Tutto ciò che sta realmente accadendo è che alcuni oggetti vengono popolati e restituiti a un documento JSP. Ho assunto che l'oggetto Session sia trasformato in un cookie JSESSIONID e inserito, insieme agli oggetti aggiunti alla richiesta, in un'intestazione http prima di essere inviato al browser.

Sarei felice di pubblicare un codice ma voglio escludere la possibilità che le mie difficoltà derivino da un fraintendimento della teoria.

+0

aggiunto del codice formattazione perché Othe era un pezzo di Wall of Text inavvicinabile. Potrebbe ancora prendere in considerazione la pubblicazione di un codice di esempio di ciò che hai provato. –

risposta

10

Poiché il cookie JSESSIONID è gestito dal servlettaintainer, questa impostazione è specifica del servlet. Non è chiaro quale stai usando, quindi ecco una risposta mirata Apache Tomcat 6.0 in modo che tu sappia in quale direzione dovrai cercare il tuo servlettaintainer: devi impostare l'attributo useHttpOnly dell'elemento <Context> dell'applicazione web su true.

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

Vedi anche Tomcat documentation circa l'elemento <Context>.

+0

Più approfondisco questo argomento, più mi rendo conto di quanto io sia completamente ignorante riguardo a quasi tutto. Sto usando JBOSS 4.0 ma, da quello che ho pronto, JBOSS è un contenitore EJB (?). Non sono sicuro di quale servlet container sto usando. Dovrò postare di nuovo quando ho scoperto che cos'è il mio servlet container. – Mythandros

+0

JBoss è un server applicazioni. Utilizza Tomcat come contenitore servlet e aggiunge alcuni EJB e altre fantastiche funzionalità JavaEE. La storia dell'EJB è irrilevante qui. Questo è un problema HTTP/Servlet. A proposito, non sono sicuro che il vecchio JBoss 4.0 supporti questo attributo ... Almeno, le istruzioni sono le stesse di Tomcat. – BalusC

+0

Sembra che nemmeno JBoss 4.3 supporti questo, avrete bisogno di 5.0: https: // issues.jboss.org/browse/JBPAPP-3088 –

5

È possibile utilizzare questo con Java EE 5:

Per le versioni Java Enterprise Edition prima di Java EE 6 una soluzione comune è quello di sovrascrivere l'intestazione di risposta HTTP Set-Cookie con un valore cookie di sessione che aggiunge esplicitamente la HttpOnly bandiera:

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

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

i test in un filtro