¿En qué condiciones se crea un JSESSIONID?

276

¿Cuándo / cuáles son las condiciones cuando JSESSIONIDse crea un?

¿Es por dominio? Por ejemplo, si tengo un servidor de aplicaciones Tomcat y despliego varias aplicaciones web, ¿se creará una diferente JSESSIONIDpor contexto (aplicación web) o se compartirá entre las aplicaciones web siempre que sean del mismo dominio?

joshjdevl
fuente

Respuestas:

324

La cookie JSESSIONID se crea / envía cuando se crea la sesión. La sesión se crea cuando su código llama request.getSession()o request.getSession(true)por primera vez. Si solo desea obtener la sesión, pero no crearla si no existe, use request.getSession(false): esto le devolverá una sesión o null. En este caso, no se crea una nueva sesión y no se envía la cookie JSESSIONID. (Esto también significa que la sesión no se crea necesariamente en la primera solicitud ... usted y su código tienen el control cuando se crea la sesión)

Las sesiones son por contexto:

SRV.7.3 Alcance de la sesión

Los objetos HttpSession deben tener un alcance a nivel de aplicación (o contexto de servlet). El mecanismo subyacente, como la cookie utilizada para establecer la sesión, puede ser el mismo para diferentes contextos, pero el objeto al que se hace referencia, incluidos los atributos en ese objeto, nunca debe ser compartido entre contextos por el contenedor.

( Especificación Servlet 2.4 )

Actualización: cada llamada a la página JSP crea implícitamente una nueva sesión si aún no hay sesión. Esto se puede desactivar con la session='false'directiva de página, en cuyo caso la variable de sesión no está disponible en la página JSP.

Peter Štibraný
fuente
2
¿no se puede crear una sesión sin una llamada explícita a getSession? con respecto a "nunca debe ser compartido entre contextos por el contenedor", websphere tiene una opción para compartir sesiones, que es la motivación para la pregunta :)
joshjdevl 03 de
No si usas solo Servlet API. Sin embargo, puede haber extensiones específicas del servidor (como el uso compartido de sesiones de Websphere como usted señala).
Peter Štibraný
Creo que su archivo context.xml puede controlar la creación de sesión automática si su etiqueta <Context> contiene un atributo de cookies, por ejemplo, <Context cookies = "false">
BT
En este momento estoy recibiendo muchos resultados en mi filtro para crear una sesión y parece que es solo después de que se está creando el segundo resultado (no una segunda actualización de página), esto llamó mi atención "la sesión no necesariamente se crea en la primera solicitud ..." es se relaciona? ¿podría dar un ejemplo de por qué esto no se crea necesariamente en la primera solicitud? ¡Gracias!
jpganz18
@ jpganz18: Si simplemente llama request.getSession()o request.getSession(true), obtiene una sesión existente o nueva. Sin embargo, si su código llama request.getSession(false), entonces obtiene una sesión existente o nula, si no existe una sesión.
Peter Štibraný
49

Aquí hay información sobre una fuente más de la JSESSIONIDcookie:

Estaba depurando un código Java que se ejecuta en un servidor Tomcat. No estaba llamando request.getSession()explícitamente a ninguna parte de mi código, pero noté que JSESSIONIDtodavía se estaba configurando una cookie.

Finalmente eché un vistazo al código Java generado correspondiente a un JSP en el directorio de trabajo en Tomcat.

Parece que, te guste o no, si invocas un JSP desde un servlet, ¡ JSESSIONIDse creará!

Agregado: Acabo de encontrar eso al agregar la siguiente directiva JSP:

<%@ page session="false" %>

puede deshabilitar la configuración de JSESSIONIDun JSP.

Rangachari Anand
fuente
3
En otras palabras: el valor predeterminado para el atributo de sesión de página es "verdadero". Lo cual puede ser inesperado en algunos (¿muchos?) Casos.
David Balažic
También estoy en Tomcat, y no uso jsp en absoluto, pero la cookie de sesión se crea de todos modos. ¿Alguna idea de cómo prevenirlo en esta situación?
ClassyPimp
23

CORRECCIÓN: Vote por la respuesta de Peter Štibraný, ¡es más correcta y completa!

Un "JSESSIONID" es la identificación única de la sesión http - vea el javadoc aquí . Allí encontrarás la siguiente oración

La información de la sesión se limita solo a la aplicación web actual (ServletContext), por lo que la información almacenada en un contexto no será visible directamente en otro.

Entonces, cuando accedes por primera vez a un sitio, se crea una nueva sesión y se vincula al SevletContext. Si implementa varias aplicaciones, la sesión no se comparte.

También puede invalidar la sesión actual y, por lo tanto, crear una nueva. Por ejemplo, al cambiar de http a https (después de iniciar sesión), es una muy buena idea crear una nueva sesión.

Espero que esto responda a su pregunta.

Mes.
fuente
1
Explicación clara del alcance de la sesión.
user3123690
@Mo el enlace está roto
Timofey
8

¡Tenga cuidado si su página incluye otros .jsp o .jspf (fragmento)! Si no configuras

<%@ page session="false" %>

en ellos también, la página principal terminará iniciando una nueva sesión y configurando la cookie JSESSIONID.

Para las páginas .jspf en particular, esto sucede si configuró su web.xml con dicho fragmento:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jspf</url-pattern>
    </jsp-property-group>
</jsp-config>

para habilitar scriptlets dentro de ellos.

Polaretto
fuente
¿Te refieres a establecer página sesión = falso en todos los fragmentos incluidos (.jsp y .jspf) y no incluirlo en el jsp principal que incluye el resto de fragmentos?
Ommadawn
2

Para los enlaces generados en un JSP con etiquetas personalizadas, tuve que usar

<%@ page session="false" %>

en el JSP

Y

request.getSession().invalidate();

en la acción Struts

Jerome Jaglale
fuente