2009-02-27 28 views
230

¿Cuándo/cuáles son las condiciones cuando se crea un JSESSIOINID?¿En qué condiciones se crea un JSESSIONID?

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

Respuesta

267

La cookie JSESSIONID se crea/envía cuando se crea la sesión. La sesión se crea cuando su código llama al 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 sesión no necesariamente se creó en la primera solicitud ... usted y su código está en control cuando se crea la sesión)

sesiones son per-contexto:

SRV.7.3 Session Scope

Los objetos HttpSession deben tener un ámbito de la aplicación (o contexto de servlet) nivel. El mecanismo subyacente, tal como la cookie se utiliza para establecer la sesión , puede ser el mismo para diferentes contextos, pero el objeto referenciado, incluyendo los atributos en que objeto, nunca debe ser compartida entre contextos por el contenedor.

(Servlet 2.4 specification)

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

+1

¿No se puede crear una sesión sin una llamada explícita a getSession? en lo que respecta a "nunca debe compartirse entre contextos por el contenedor", websphere tiene una opción para compartir sesiones, que es la motivación para la pregunta :) – joshjdevl

+0

No si usa solo API de Servlet. Sin embargo, puede haber extensiones específicas del servidor (como el uso compartido de sesiones de Websphere como usted señala). –

+0

Creo que su archivo context.xml puede controlar la creación automática de la sesión si su etiqueta contiene un atributo de cookies, p.

16

CORRECCIÓN: ¡Por favor, vote la respuesta de Peter Štibraný - es más correcto y completo!

Un "JSESSIONID" es el id. Único de la sesión http - see the javadoc here. En el javadoc encontrará la siguiente oración: "La información de la sesión tiene un alcance solo para la aplicación web actual (ServletContext), por lo que la información almacenada en un contexto no será visible directamente en otro".

De modo que la primera vez que visita un sitio, se crea una nueva sesión y se enlaza al SevletContext. Si despliega varias aplicaciones, la sesión no se comparte.

También puede invalidar la sesión actual y, por lo tanto, crear una nueva. p.ej. Al cambiar de http a https (después del inicio de sesión), es una muy buena idea crear una nueva sesión.

Espero, esto responde a su pregunta.

+1

Explicación clara del alcance de la sesión. – user3123690

+0

@Mo el enlace está roto – Tim

37

Aquí hay alguna información acerca de una fuente más de la JSESSIONID cookie:

sólo estaba depurando algún código Java que se ejecuta en el servidor Tomcat. No estaba llamando al request.getSession() explícitamente en ninguna parte de mi código, pero noté que todavía se estaba estableciendo una cookie JSESSIONID.

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

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

Agregado: Me acaba de encontrar que al añadir la siguiente directiva JSP:

<%@ page session="false" %> 

puede desactivar el ajuste de JSESSIONID por un JSP.

+3

En otras palabras: el valor predeterminado para el atributo de sesión de página es "verdadero". Lo cual podría ser inesperado en algunos (¿muchos?) Casos. –

+0

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

1

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

<%@ page session="false" %> 

en el JSP

Y

request.getSession().invalidate(); 

en los puntales acción

7

Tenga cuidado si ¡tu página incluye otros .jsp o .jspf (fragmento)! Si no se establece

<%@ page session="false" %> 

en ellos también, la página principal va a terminar iniciar una nueva sesión y el establecimiento de la cookie JSESSIONID.

Para .jspf páginas en particular, esto sucede si se ha configurado el web.xml con un fragmento de este tipo:

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

el fin de permitir scriptles dentro de ellos.

Cuestiones relacionadas