web-dev-qa-db-fra.com

Quelle est la différence entre Session.Abandon () et Session.Clear ()

Quelle est la différence entre détruire une session et supprimer ses valeurs? Pouvez-vous s'il vous plaît fournir un exemple démontrant cela?

J'ai cherché cette question, mais je ne comprends pas la réponse totale. Certaines réponses sont:

  • Session.Abandon() détruit la session
  • Session.Clear() supprime simplement toutes les valeurs

Un ami m'a dit ceci:

Effacer la session ne désélectionnera pas la session, elle existe toujours avec le même ID pour l'utilisateur mais avec les valeurs simplement effacées.

Abandon détruira complètement la session, ce qui signifie que vous devez commencer une nouvelle session avant de pouvoir stocker d'autres valeurs dans la session pour cet utilisateur.

Le code ci-dessous fonctionne et ne lève aucune exception.

Session.Abandon();
Session["tempKey1"] = "tempValue1";

Lorsque vous abandonnez () une session, vous (ou plutôt l'utilisateur) obtiendrez un nouvel identifiant de session

Lorsque je teste Session, cela ne change rien lorsque j'abandonne la session.

Je viens de trouver une différence: session.Abandon() soulève Session_End

102
backdoor

Clear - Supprime toutes les clés et valeurs de la collection d'états de session.

Abandon - supprime tous les objets stockés dans une session. Si vous n'appelez pas explicitement la méthode Abandon, le serveur supprime ces objets et détruit la session lorsque celle-ci arrive à expiration.
Il soulève également des événements tels que Session_End .

Session.Clear peut être comparé à en supprimant tous les livres de l'étagère, alors que Session.Abandon ressemble davantage à jeter toute l'étagère.

Vous dites:

Lorsque je teste Session, cela ne change rien lorsque j'abandonne la session.

Ceci est correct lorsque vous le faites avec une seule demande .
À la prochaine demande, la session sera différente. Mais le ID de session peut être réutilisé pour que l'identifiant reste le même.

Si vous utilisez Session.Clear, vous aurez la même session dans de nombreuses demandes.

Généralement, dans la plupart des cas, vous devez utiliser Session.Clear.
Vous pouvez utiliser Session.Abandon si vous êtes sûr que l'utilisateur va quitter votre site.

Revenons donc aux différences:

  1. Abandon déclenche la requête Session_End.
  2. Clear supprime les objets immédiatement, Abandon non.
  3. Abandon libère l'objet SessionState et ses éléments afin qu'il puisse collecter des ordures pour libérer les ressources. Clear conserve SessionState et les ressources qui lui sont associées.
140
Dmytrii Nagirniak

Lorsque vous Abandon() une session, vous (ou plutôt l'utilisateur) obtiendrez un nouvel identificateur de session (lors de la prochaine requête). Lorsque vous Clear() une session, toutes les valeurs stockées sont supprimées, mais le SessionId reste intact.

19
Hans Kesting

Ceci est sorte de couvert par les diverses réponses ci-dessus, mais la première fois que j'ai lu cet article, j'ai manqué un fait important, ce qui a conduit à un bug mineur dans mon code ...

Session.Clear() effacera les valeurs de toutes les touches mais NE provoquera PAS le déclenchement de l'événement de fin de session.

Session.Abandon() n'effacera PAS les valeurs de la demande en cours. SI une autre page est demandée, les valeurs disparaîtront pour celle-ci. Cependant, abandonner va lancer l'événement.

Donc, dans mon cas (et peut-être dans le vôtre?), J'avais besoin de Clear() suivi de Abandon().

8
NRC

ce code fonctionne et ne lève aucune exception:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

En effet, lorsque la méthode Abandon est appelée, l'objet Session en cours est mis en file d'attente pour suppression mais il n'est en réalité supprimé que lorsque toutes les commandes de script de la page en cours ont été traitées. Cela signifie que vous pouvez accéder aux variables stockées dans l'objet Session sur la même page que l'appel à la méthode Abandon mais pas dans les pages Web suivantes.

Par exemple, dans le script suivant, la troisième ligne affiche la valeur Mary. Cela est dû au fait que l'objet Session n'est pas détruit tant que le serveur n'a pas terminé le traitement du script.

<% 
  Session.Abandon  
  Session("MyName") = "Mary" 
  Reponse.Write(Session("MyName")) 
%>

Si vous accédez à la variable MyName sur une page Web suivante, elle est vide. En effet, MyName a été détruit avec l'objet Session précédent lorsque la page contenant l'exemple précédent a été traitée.

à partir de MSDN Session.Abandon

5
Seven

clear-its supprime la clé ou les valeurs de la collection d'état de session.

abandon-its supprime ou supprime des objets de session d'une session.

3
maxy

Effacer une session supprime les valeurs qui y étaient stockées, mais vous pouvez toujours en ajouter de nouvelles. Après avoir détruit la session, vous ne pouvez pas y ajouter de nouvelles valeurs.

3
RaYell
Session.Abandon() 

va détruire/tuer toute la session.

Session.Clear()

supprime/efface les données de la session (c’est-à-dire les clés et les valeurs de la session en cours) mais la session sera active.

Comparez à la méthode Session.Abandon (), Session.Clear () ne crée pas la nouvelle session, il crée simplement toutes les variables de la session sur NULL.

L'identifiant de session restera le même dans les deux cas, tant que le navigateur n'est pas fermé.

Session.RemoveAll()

Il supprime toutes les clés et les valeurs de la collection d'état de session.

Session.Remove()

Il supprime un élément de la collection d’états de session.

Session.RemoveAt()

Il supprime un élément à un index spécifié de la collection d'état de session.

Session.TimeOut()

Cette propriété spécifie le délai d'expiration attribué à l'objet Session pour l'application. (l'heure sera spécifiée en minutes).

Si l'utilisateur n'actualise pas ou ne demande pas de page dans le délai imparti, la session se termine.

1
Laxmi

L'existence de sessionid peut provoquer l'attaque de fixation de session qui constitue l'un des points essentiels de la conformité PCI. Pour supprimer l'ID de session et surmonter l'attaque de fixation de session, lisez cette solution - Comment éviter la vulnérabilité de fixation de session dans ASP.NET? .

0
Sheo Narayan
this code works and dont throw any exception:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

Une chose à noter ici que Session.Clear supprime les éléments immédiatement, mais Session.Abandon marque la session à abandonner à la fin de la requête en cours. Cela signifie simplement que si vous avez essayé d'accéder à la valeur dans le code juste après l'exécution de la commande session.abandon, elle sera toujours là. Ne vous trompez donc pas si votre code ne fonctionne tout simplement pas, même après avoir émis la commande session.abandon et effectué immédiatement une certaine logique avec la session.

0
Biki

Je pense qu'il serait utile d'utiliser Session.Clear() plutôt que d'utiliser Session.Abandon().

Parce que les valeurs existent toujours dans la session après un appel ultérieur, mais sont supprimées après avoir appelé l'ancien.

0
Pra