2009-04-30 20 views
22

Estoy usando cookies basadas en sesiones con mi sitio web. Para mi completa sorpresa, noté que si establecía una cookie de sesión (no una cookie persistente), cierro una pestaña y luego volví a conectar con el sitio, las cookies de sesión todavía están allí. Eso no es lo que hubiera esperado, en realidad. Hubiera esperado que se eliminaran las cookies de la sesión.¿Por qué no cerrar una pestaña Eliminar una cookie de sesión?

Si cierra el navegador, se elimina una cookie de sesión, entonces ¿por qué no cerrar una pestaña para obtener el mismo resultado?

Por lo tanto, estoy usando PHP5 y jQuery. ¿Hay algo que pueda hacer para que cuando se cierre una pestaña pueda solucionar el problema de esta sesión? Desafortunadamente, el evento onbeforeunload en la etiqueta BODY no es útil aquí porque cuando haces clic fuera de una página, se dispara ese evento, no solo cerrando una pestaña.

Respuesta

14

La cookie de sesión es por proceso, no por ventana. Entonces, incluso si seleccionas Nueva ventana, obtendrás la misma identificación de sesión. Este comportamiento tiene sentido. No le gustaría que un usuario vuelva a iniciar sesión cada vez que abriera una nueva ventana mientras navegaba por su sitio.

No estoy al tanto de ninguna manera real alrededor de esto.

+0

Paul, vea mi comentario a Sander a continuación que comienza, "El problema aquí ..." –

+1

En tales circunstancias, el cierre de la pestaña no es el problema principal. Está controlando la expiración de la sesión más activamente. Deberá implementar algún tipo de tiempo de espera de actividad en el cliente en JS que se desconecta automáticamente después de que no haya actividad del usuario. Encontrará este tipo de comportamiento en la mayoría de los sitios bancarios. –

+0

Paul, tienes razón. Dormí sobre el tema y ese es el curso de acción que planeo tomar. Ahora, para agregar otra pregunta de stackoverflow sobre la forma más óptima de implementar eso. –

8

Esto es por diseño y tratar de cambiarlo es una muy mala idea. ¿Qué sucede si un usuario abre un enlace en una pestaña nueva y lo cierra? ¿Debería destruirse la sesión en la pestaña original? ¡Por supuesto no! Esto demuestra por qué ni siquiera deberías pensar en esto.

Una sesión finaliza cuando se cierra la última ventana del navegador. Si quiere algo más, usted:

  1. no quiero sesiones;
  2. necesita hacer su propia infraestructura de "mini-sesión";
  3. es probable que estén en un mundo de daños y errores.
+3

El problema aquí es un entorno público, como una biblioteca, y el perfil en línea de alguien con información de identidad dentro. Necesito encontrar una solución. –

+0

Sin embargo, parece que tiene algunas buenas respuestas a esta pregunta, y debería elegir una de ellas como la respuesta correcta. ¿Quizás también quiera comenzar una nueva pregunta? – bignose

3

También puede escribir un javascript que detecta cuando una ficha se cierra y eliminar la cookie en el javascript

+3

¿Cómo pudiste hacer eso? – thesecretmaster

+0

intentar añadir un detector de eventos beforeunload – Hammer

+0

hice algo como esto $ (ventana) .scroll (function() { \t \t si (sessionStorage.getItem ('advertOnce') == 'verdadera') { \t \t \t \t sessionStorage.setItem ('advertOnce', 'verdadero'); \t \t \t \t initPopup(); \t \t \t \t \t} \t}); –

2

Sesión de almacenamiento Web se puede utilizar en lugar de las galletas si necesita dependerá de cierre de pestaña.

1

Encontré un trabajo alrededor.

Estoy trabajando en ASP.NETC#. Tengo un Master Page para todas las páginas del sitio a excepción de la página Login. En el Master Page Sever Page Load event obtengo el Url de la página de referencia y compruebo si contiene la raíz del sitio; si no, redirecciono a la página Login y, dado que no tiene ese Master Page, aparece.

Esto funciona si intento acceder a una página desde otro sitio o si ingreso el Url al cuadro de dirección del navegador. Por lo tanto, si cierra la pestaña e intenta volver a ingresar desde otra pestaña o volver a abrir la pestaña, aunque la cookie no haya sido eliminada, no podrá volver a ingresar al sitio sin pasar por Login. Esto también funciona incluso si no ha cerrado la pestaña y navega entre diferentes sitios en la misma pestaña.

Este es el código

if (Request.UrlReferrer == null || !Request.UrlReferrer.AbsoluteUri.ToString().Contains("root")) 
     { 
      Response.Redirect("~/Account/Login.aspx"); 
     } 

Al navegar desde dentro del sitio no hay ningún problema, incluso si abre un enlace a otra página en el sitio a otra pestaña se abre.

Si desea asegurarse, además, de que puede eliminar la sesión y la cookie de autenticación en esa cláusula if antes de redirigir a la página Login.

Esto no funcionará cuando un usuario navega a otro sitio en la misma pestaña y presiona el botón de los navegadores back to porque eso funciona en la memoria caché y no envía automáticamente una solicitud al servidor.

Esto no elimina la sesión o la cookie de autenticación al cerrar la pestaña, pero puede ayudar a evitar que se vuelva a ingresar al sitio sin iniciar sesión después de cerrar la pestaña.

Cuestiones relacionadas