Ho una situazione in cui ho due diverse webapp in esecuzione su un singolo server, utilizzando porte diverse. Entrambi eseguono il contenitore del servlet Jetty di Java, quindi entrambi utilizzano un parametro cookie denominato JSESSIONID per tenere traccia dell'id di sessione. Queste due webapp stanno combattendo per l'ID della sessione.JSESSIONID collisione tra due server sullo stesso IP ma diverse porte
- Aprire una scheda di Firefox, e andare a WebApp1
- risposta HTTP di WebApp1 ha un'intestazione set-cookie con JSESSIONID = 1
- Firefox ha ora un colpo di testa del biscotto con JSESSIONID = 1 in tutta la sua richieste HTTP a WebApp1
- Aprire una seconda scheda di Firefox, e andare a WebApp2
- la reqeust HTTP per WebApp2 ha anche un Cookie con JSESSIONID = 1, ma nel doGet, quando chiamo
req.getSession(false);
ottengonull
. E se chiamoreq.getSession(true)
ottengo un nuovo oggetto Session, ma la risposta HTTP da WebApp2 ha un'intestazione set-cookie con JSESSIONID = 20 - Ora, WebApp2 ha una sessione funzionante, ma la sessione di WebApp1 non c'è più. Andare su WebApp1 mi darà una nuova sessione, spazzando via la sessione di WebApp2.
- continuare per sempre
Così le sessioni sono botte tra ogni applicazione web. Mi piacerebbe molto che lo req.getSession(false)
restituisse una sessione valida se esiste già un cookie JSESSIONID definito.
Un'opzione è di reimplementare fondamentalmente il framework Session con una HashMap e cookie chiamati WEBAPP1SESSIONID e WEBAPP2SESSIONID, ma questo fa schifo, e significa che dovrò hackerare il nuovo materiale della sessione in ActionServlet e in altri posti.
Questo deve essere un problema che altri hanno riscontrato. È Jetty's HttpServletRequest.getSession(boolean)
solo schifoso?
mio problema è che, quando Jetty va a creare una nuova sessione, per impostazione predefinita, non prova nemmeno a utilizzare il valore esistente di JSESSIONID. Si sceglie solo un nuovo valore per questo. Se riutilizzasse quelli esistenti, le mie due istanze di Jetty potrebbero essere belle. –