Domanda

Per impostazione predefinita tomcat crea un cookie di sessione per il dominio corrente.

Se siete su www.example.com, il cookie viene creato per www.example.com (funziona solo su www.example.com).Mentre per example.com sarà creato per .example.com (comportamento desiderato, funziona su qualsiasi sottodominio example.com così come example.com di per sé).

Ho visto un paio di Tomcat valvole che sembrano intercettare la creazione di cookies di sessione e creare una sostituzione cookie con il corretto .example.com dominio, tuttavia nessuno di loro sembra funzionare alla perfezione e tutti sembrano lasciare i cookie esistenti e solo crearne uno nuovo.Questo significa che due JSESSIONID i cookie vengono inviati con ogni richiesta.

Mi chiedevo se qualcuno ha una soluzione definitiva a questo problema.

È stato utile?

Soluzione

Questo è apparentemente sostenuto tramite un'impostazione di configurazione in 6.0.27 e poi:

La configurazione è effettuata mediante la modifica META-INF/context.xml

<Context sessionCookiePath="/something" sessionCookieDomain=".domain.tld" />

https://issues.apache.org/bugzilla/show_bug.cgi?id=48379

Altri suggerimenti

Ho appena passato attraverso tutto questo alla ricerca di una soluzione semplice.Ho iniziato a guardare da tomcat prospettiva prima.

Tomcat non dare accesso diretto alla configurazione del dominio cookie di sessione, e io sicuramente non voglio patch personalizzate tomcat risolvere il problema, come mostrato in alcuni post di altri.

Valvole di tomcat e sembra anche essere una soluzione del problema a causa delle limitazioni sull'accesso intestazioni e i cookie costruito nel Servlet specification.Inoltre, non completamente se la risposta http è impegnata, prima che viene passato alla valvola.

Dal momento che abbiamo proxy nostre richieste attraverso Apache, poi ho spostato su come utilizzare apache per risolvere il problema, invece.

Ho provato per la prima volta il mod_proxy direttiva ProxyPassReverseCookieDomain, ma non funziona per JSESSIONID cookie perché tomcat non impostare l'attributo di dominio e ProxyPassReverseCookieDomain non può funzionare senza un qualche tipo di dominio, essendo parte del cookie.

Ho anche incontrato un hack utilizzando Proxypassreverse dove sono stati riscrittura del percorso per aggiungere un attributo dominio dei cookie, ma che sentiva modo disordinato per un sito di produzione.

Ho finalmente capito di lavoro per riscrivere le intestazioni di risposta utilizzando il mod_headers modulo di apache come detto da Dave sopra.

Ho aggiunto la seguente riga all'interno del virtual host definizione:

Header edit Set-Cookie "(JSESSIONID\s?=[^;,]+?)((?:;\s?(?:(?i)Comment|Max-Age|Path|Version|Secure)[^;,]*?)*)(;\s?(?:(?i)Domain\s?=)[^;,]+?)?((?:;\s?(?:(?i)Comment|Max-Age|Path|Version|Secure)[^;,]*?)*)(,|$)" "$1$2; Domain=.example.com$4$5"

Di cui sopra dovrebbero essere tutti una sola riga nel file config.Andrà a sostituire qualsiasi JSESSIONID cookie di dominio di un attributo con ".example.com".Se un JSESSIONID cookie non contengono un attributo di dominio, quindi il modello aggiungerà uno con un valore ".example.com".Come bonus, questa soluzione non soffrono il doppio JSESSION cookies problema di valvole.

Il modello dovrebbe funzionare con più cookie in intestazione Set-Cookie senza influenzare gli altri cookies nell'intestazione.Dovrebbe anche essere modificati per funzionare con altri cookie modificando JSESSIONID nella prima parte del motivo per che cosa mai il nome del cookie è desiderio.

Io non sono reg-ex utente di alimentazione, quindi sono sicuro che ci sono un paio di ottimizzazioni che potrebbe essere fatto per il modello, ma sembra di lavorare per noi finora.

Voglio aggiornare questo post se trovo qualche bug con il modello.Spero che questo possa interrompere un paio di dover passare attraverso l'ultimo paio di giorni vale la pena di frustrazioni come ho fatto io.

Ho eseguito in questo a $DAYJOB.Nel mio caso ho voluto implementare SSL signon quindi reindirizzare a un non SSL pagina.Il problema principale tomcat è il metodo (dalla memoria) SessionManager.configureSessionCookie hard codici di tutte le variabili che si desidera ottenere accesso.

Sono venuto con alcune idee, tra cui una particolarmente eclatanti hack utilizzando mod_headers in apache per riscrivere i cookie in base alla regex sostituzione.

Il definative modo per risolvere il problema sarebbe quello di inviare una patch per il tomcat sviluppatori che aggiunge parametri configurabili per il SessionManager classe.

Come una sessione (e il suo Id) è fondamentalmente considerato di valore solo per l'emissione di applicazione, si può invece cercare di impostare un cookie aggiuntivo.Avere uno sguardo a Gattoni SingleSignOnValve, che fornisce l'extra-Cookie JSESSIONIDSSO (nota il ...SSO) per il percorso del server "/" invece di "/nomeapplicazione" (come JSESSIONID i cookie sono impostati di solito).

Con tale Valvola si può realizzare qualsiasi comunicazione interprocesso è necessario per sincronizzare qualsiasi stato tra i diversi server, host virtuali o webapps di tomcat/webserver/qualunque cosa.

Un altro motivo per cui non è possibile utilizzare tomcat cookie di sessione per i propri scopi è, che più webapps sullo stesso host sono diversi id di sessione.E. g.ci sono diversi cookies per "/webapp1" e "/webapp2".Se si forniscono "/webapp1"'s cookie "/webapp2", questo non sarebbe trovare la sessione di riferimento, di invalidare la sessione+cookie e impostare il proprio nuovo.Dovresti riscrivere tutto gattoni gestione della sessione di accettare esterno valori di id della sessione (pessima idea securitywise) o per condividere un certo stato tra le applicazioni.

Sessione di trattamento dovrebbe essere considerato il container (tomcat) business.Quant'altro è necessario che si dovrebbe aggiungere, senza interferire con ciò che il contenitore ritiene che è necessario fare.

La valvola di tecniche non sembrano essere perfetta al 100%.Se avete il coraggio di modificare Tomcat stesso:

catalina.jar contiene la seguente classe: org.apache.catalina.connettore.Richiesta

La Richiesta ha un metodo:

configureSessionCookie(Cookie cookie)

Per il nostro ambiente era meglio codificare, ma si poteva fare di più fantasia di logica:

cookie.setDomain(".xyz.com");

Sembra funzionare perfettamente.Sarebbe bello se questo era configurabile in tomcat.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top