2011-06-05 27 views
7

tengo aplicación Java Web donde tengo que dejar de sesión que se comparte entre las pestañas del navegador, lo que significasesión compartida entre las pestañas

usuario abre un navegador, inicia sesión en su cuenta y se abre una página en particular en una nueva pestaña en el mismo navegador. Según la configuración predeterminada, la sesión se comparte en la nueva pestaña y el usuario inicia sesión automáticamente en la nueva pestaña. ¿Alguien puede decir cómo se puede detener esto, así que al menos puedo restringir esto en algunas páginas sensibles, si no en toda la aplicación?

+1

posible duplicado de [¿Cómo diferenciar sesiones en las pestañas del navegador?] (Http://stackoverflow.com/questions/368653/how-to-differ-sessions-in-browser-tabs) –

+0

¿está utilizando javascript en su aplicación – developer

Respuesta

8

Por lo general, las cookies se utilizan para el manejo de la sesión. Entonces, todas las pestañas y ventanas del navegador comparten la misma sesión. Pero puede configurar su contenedor de servlets para usar la reescritura de URL en lugar de las cookies. (Aquí está un example for Jetty.)

Con la reescritura de URL, la sesión solo se identifica a través de un parámetro de URL que contiene la ID de la sesión. Por lo tanto, cada URL interna de su aplicación web debe ser mejorada con este parámetro usando el método HttpServletResponse.encodeURL(). Si está utilizando un marco web como Wicket, es probable que esto ya esté hecho para usted.

Con la reescritura de URL es posible tener varias sesiones independientes en diferentes ventanas o pestañas de la misma instancia del navegador.

Actualización: En respuesta a la downvote Quiero dejar claro el diferente comportamiento de la reescritura de URL:

Supongamos que la URL del sitio web es http://webapp.com.

Cookies: Abra http://webapp.com en la primera pestaña del navegador.

El servidor crea una sesión y envía una cookie en la respuesta.

El navegador almacena la cookie.

A continuación, abra http://webapp.com en la segunda pestaña del navegador. El navegador asocia esta URL con la cookie almacenada recientemente y agrega la cookie a la solicitud.

Para el servidor no hay diferencia entre las solicitudes de la primera o la segunda pestaña del navegador y responde desde la misma sesión. A veces este es el comportamiento deseado.

la reescritura de URL: abierto http://webapp.com en la primera pestaña del navegador.

El servidor crea una sesión con ID 1 y agrega el parámetro jsessionid = 1 a cada URL en la página de respuesta. No se transfiere ninguna cookie.

Todas las demás solicitudes a otra página de la misma aplicación web de la primera pestaña del navegador incluyen la ID de la sesión (por ejemplo, 1).

A continuación, abra http://webapp.com en la segunda pestaña del navegador. ¡Aquí está la diferencia! Debido a que no hay cookie ni parámetro jsessionid en la solicitud, el servidor crea una nueva sesión (es decir, ID 2) y agrega el parámetro jsessionid = 2 a cada URL contenida en la página de respuesta. A partir de ahora, todas las solicitudes posteriores de la segunda pestaña del navegador están asociadas a la sesión 2.

Así que tiene dos sesiones independientes en el mismo navegador.

+0

-1. La codificación de la ID de la sesión en la URL no hace más que poner a disposición del cliente la ID de la sesión en ausencia de cookies. Las cookies no cambian en las pestañas, ni tampoco en la ID de sesión, lo que da como resultado que la ID de sesión codificada en la URL permanezca igual en las pestañas. –

+0

Existe una diferencia entre las cookies y la reescritura de URL. Ver mi respuesta actualizada. – vanje

+1

Todavía tiene un problema cuando el usuario abre un enlace de la primera pestaña o copia la URL de la primera pestaña en una nueva pestaña. – BalusC

0

Si está utilizando Javascript, le puedo proporcionar una alternativa. a) Tenga un parámetro oculto en la pantalla de inicio de sesión, configure el nombre de ventana para ese campo oculto b) cuando inicie sesión (envíe la solicitud), en clase de acción compruebe si el parámetro de solicitud no es nulo y es igual a la página de inicio, es una solicitud válida, significa que ingresa a la página de inicio ingresando, si no es redirigido a una página no válida.

Cuestiones relacionadas