¿Cuál es la diferencia entre destruir una sesión y eliminar sus valores? ¿Puede proporcionar un ejemplo que demuestre esto?
Busqué esta pregunta, pero no capto la respuesta total. Algunas respuestas son:
Session.Abandon()
destruye la sesiónSession.Clear()
solo elimina todos los valores
Un amigo me dijo esto:
Borrar la sesión no anulará la sesión, todavía existe con el mismo ID para el usuario pero con los valores simplemente borrados.
El abandono destruirá la sesión por completo, lo que significa que debe comenzar una nueva sesión antes de poder almacenar más valores en la sesión para ese usuario.
El siguiente código funciona y no arroja ninguna excepción.
Session.Abandon();
Session["tempKey1"] = "tempValue1";
Cuando abandona () una sesión, usted (o más bien el usuario) obtendrá un nuevo SessionId
Cuando pruebo la sesión, no hace ningún cambio cuando abandono la sesión.
Solo encuentro una diferencia:
session.Abandon()
sube el Session_End
evento
fuente
Respuestas:
Borrar : elimina todas las claves y valores de la colección de estado de sesión.
Abandonar : elimina todos los objetos almacenados en una sesión. Si no llama al método Abandon explícitamente, el servidor elimina estos objetos y destruye la sesión cuando se agota el tiempo de espera.
También genera eventos como Session_End .
Session.Clear se puede comparar con quitar todos los libros del estante , mientras que Session.Abandon es más como tirar todo el estante .
Tu dices:
Esto es correcto mientras lo hace dentro de una sola solicitud .
En la próxima solicitud, la sesión será diferente. Pero la identificación de sesión se puede reutilizar para que la identificación siga siendo la misma.
Si va a utilizar Session.Clear, tendrá la misma sesión en muchas solicitudes.
Generalmente, en la mayoría de los casos es necesario utilizar Session.Clear.
Puede utilizar Session.Abandon si está seguro de que el usuario abandonará su sitio.
Así que volvamos a las diferencias:
fuente
Session.Clear
se puede comparar a sacar todos los libros del estante inmediatamente , mientras queSession.Abandon
es más como decir "tira todo el estante y avísame cuando hayas terminado ".Cuando tenga
Abandon()
una sesión, usted (o más bien el usuario) obtendrá un nuevo SessionId (en la próxima solicitud). Cuando tieneClear()
una sesión, todos los valores almacenados se eliminan, pero el SessionId permanece intacto.fuente
Se trata de una especie de cubierta por las diferentes respuestas anteriores, pero la primera vez que leí este artículo se perdió un hecho importante, lo que condujo a un error menor en mi código ...
Session.Clear()
BORRARÁ los valores de todas las claves pero NO provocará que se active el evento de fin de sesión.Session.Abandon()
NO borrará los valores de la solicitud actual. SI se solicita otra página, los valores desaparecerán para esa. Sin embargo, abandonar WILL lanzará el evento.Entonces, en mi caso (¿y quizás en el tuyo?), Necesitaba que me
Clear()
siguieranAbandon()
.fuente
Esto se debe a que cuando se llama al método Abandon, el objeto Session actual se pone en cola para su eliminación, pero en realidad no se elimina hasta que se hayan procesado todos los comandos de la secuencia de comandos en la página actual. Esto significa que puede acceder a las variables almacenadas en el objeto Session en la misma página que la llamada al método Abandon pero no en ninguna página web posterior.
Por ejemplo, en el siguiente script, la tercera línea imprime el valor Mary. Esto se debe a que el objeto Session no se destruye hasta que el servidor haya terminado de procesar el script.
Si accede a la variable MyName en una página web posterior, está vacía. Esto se debe a que MyName se destruyó con el objeto Session anterior cuando la página que contenía el ejemplo anterior terminó de procesarse.
de la sesión de MSDN.
fuente
Al borrar una sesión, se eliminan los valores que se almacenaron allí, pero aún puede agregar nuevos allí. Después de destruir la sesión, no puede agregar nuevos valores allí.
fuente
clear-its elimina la clave o los valores de la colección de estado de sesión.
abandon-its eliminar o eliminar objetos de sesión de la sesión ..
fuente
destruirá / matará toda la sesión.
elimina / borra los datos de la sesión (es decir, las claves y valores de la sesión actual) pero la sesión estará activa.
Compare con el método Session.Abandon (), Session.Clear () no crea la nueva sesión, solo hace que todas las variables de la sesión sean NULL.
El ID de sesión seguirá siendo el mismo en ambos casos, siempre que el navegador no esté cerrado.
Elimina todas las claves y valores de la colección de estado de sesión.
Elimina un elemento de la colección de estado de sesión.
Elimina un elemento en un índice especificado de la colección de estado de sesión.
Esta propiedad especifica el período de tiempo de espera asignado al objeto Sesión para la aplicación. (el tiempo se especificará en minutos).
Si el usuario no actualiza o solicita una página dentro del período de tiempo de espera, la sesión finaliza.
fuente
La existencia de sessionid puede causar el ataque de fijación de sesión que es uno de los puntos en el cumplimiento de PCI. Para eliminar el id de sesión y superar el ataque de fijación de sesión, lea esta solución: ¿Cómo evitar la vulnerabilidad de fijación de sesión en ASP.NET? .
fuente
Creo que sería útil usarlo en
Session.Clear()
lugar de usarloSession.Abandon()
.Porque los valores todavía existen en la sesión después de llamar más tarde, pero se eliminan después de llamar al primero.
fuente
Una cosa a tener en cuenta aquí es que Session.Clear elimina elementos inmediatamente, pero Session.Abandon marca la sesión como abandonada al final de la solicitud actual. Eso simplemente significa que suponga que intentó acceder al valor en el código justo después de que se ejecutó el comando session.abandon, todavía estará allí. Así que no se confunda si su código simplemente no funciona incluso después de emitir el comando session.abandon e inmediatamente hacer algo de lógica con la sesión.
fuente