Tengo una situación en la que tengo dos webapps diferentes ejecutándose en un solo servidor, usando diferentes puertos. Ambos ejecutan el contenedor de servlets Jetty de Java, por lo que ambos usan un parámetro de cookie llamado JSESSIONID para rastrear la identificación de la sesión. Estas dos webapps están peleando por la identificación de la sesión.Colisión de JSESSIONID entre dos servidores en la misma ip pero puertos diferentes
- Abrir una pestaña de Firefox, e ir a WebApp1
- respuesta HTTP de WebApp1 tiene una cabecera de set-galleta con JSESSIONID = 1
- Firefox ahora tiene una cabecera Cookie con JSESSIONID en todo = 1 es peticiones HTTP a WebApp1
- abierto una segunda pestaña de Firefox, e ir a webapp2
- el reqeust HTTP para webapp2 también tiene una cabecera Cookie con JSESSIONID = 1, pero en el doGet, cuando llamo
req.getSession(false);
consigonull
. Y si llamo alreq.getSession(true)
obtengo un nuevo objeto Session, pero luego la respuesta HTTP de WebApp2 tiene un encabezado set-cookie con JSESSIONID = 20 - Ahora, WebApp2 tiene una sesión de trabajo, pero la sesión de WebApp1 se ha ido. Ir a WebApp1 me dará una nueva sesión, eliminando la sesión de WebApp2.
- continuar para siempre
Así que las sesiones se THRASHING entre cada aplicación web. Realmente me gustaría que req.getSession(false)
devuelva una sesión válida si ya se ha definido una cookie JSESSIONID.
Una opción es básicamente reimplementar el marco de sesión con un HashMap y las cookies llamadas WEBAPP1SESSIONID y WEBAPP2SESSIONID, pero eso apesta, y significa que tendré que hackear el nuevo material de sesión en ActionServlet y en algunos otros lugares.
Esto debe ser un problema que otros han encontrado. ¿Jetty's HttpServletRequest.getSession(boolean)
es horrible?
Mi problema es que, cuando embarcadero va a crear una nueva sesión, por defecto, no siquiera trató de utilizar el valor actual de JSESSIONID. Simplemente elige un nuevo valor para ello. Si reutiliza los existentes, mis dos instancias de Jetty podrían ser agradables. –