Was ist der Unterschied zwischen Session.Abandon () und Session.Clear ()

109

Was ist der Unterschied zwischen dem Zerstören einer Sitzung und dem Entfernen ihrer Werte? Können Sie bitte ein Beispiel dafür angeben?

Ich habe nach dieser Frage gesucht, aber keine vollständige Antwort erhalten. Einige Antworten sind:

  • Session.Abandon() zerstört die Sitzung
  • Session.Clear() entfernt einfach alle Werte

Ein Freund sagte mir Folgendes:

Durch das Löschen der Sitzung wird die Sitzung nicht deaktiviert. Sie ist weiterhin mit derselben ID für den Benutzer vorhanden, die Werte werden jedoch einfach gelöscht.

Durch den Abbruch wird die Sitzung vollständig zerstört. Dies bedeutet, dass Sie eine neue Sitzung beginnen müssen, bevor Sie weitere Werte in der Sitzung für diesen Benutzer speichern können.

Der folgende Code funktioniert und löst keine Ausnahmen aus.

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

Wenn Sie eine Sitzung abbrechen (), erhalten Sie (oder besser gesagt der Benutzer) eine neue Sitzungs-ID

Wenn ich die Sitzung teste, ändert sich nichts, wenn ich die Sitzung abbreche.

Ich finde nur einen Unterschied: session.Abandon()Erhöht das Session_EndEreignis

Hintertür
quelle
5
Session.Clear entfernt Elemente sofort, aber Session.Abandon markiert die Sitzung, die am Ende der aktuellen Anforderung abgebrochen werden soll.
RepDbg

Antworten:

147

Löschen - Entfernt alle Schlüssel und Werte aus der Sitzungsstatuserfassung.

Abbruch - Entfernt alle in einer Sitzung gespeicherten Objekte. Wenn Sie die Abandon-Methode nicht explizit aufrufen, entfernt der Server diese Objekte und zerstört die Sitzung, wenn die Sitzung abgelaufen ist.
Es werden auch Ereignisse wie Session_End ausgelöst .

Session.Clear kann mit verglichen werden Entfernen aller Bücher aus dem Regal , während Session.Abandon eher dem Wegwerfen des gesamten Regals gleicht .

Du sagst:

Wenn ich die Sitzung teste, ändert sich nichts, wenn ich die Sitzung abbreche.

Dies ist korrekt, während Sie dies nur innerhalb einer Anfrage tun .
Bei der nächsten Anfrage wird die Sitzung anders sein. Die Sitzungs-ID kann jedoch wiederverwendet werden sodass die ID gleich bleibt.

Wenn Sie Session.Clear verwenden, haben Sie in vielen Anfragen dieselbe Sitzung.

Im Allgemeinen müssen Sie in den meisten Fällen Session.Clear verwenden.
Sie können Session.Abandon verwenden, wenn Sie sicher sind, dass der Benutzer Ihre Site verlassen wird.

Also zurück zu den Unterschieden:

  1. Abandon löst die Session_End-Anforderung aus.
  2. Clear entfernt Objekte sofort, Abandon nicht.
  3. Abandon gibt das SessionState-Objekt und seine Elemente frei, damit der gesammelte Müll zur Freigabe der Ressourcen verwendet werden kann. Clear behält SessionState und die damit verbundenen Ressourcen bei.
Dmytrii Nagirniak
quelle
und wenn ich session.clear () aufrufe, sagst du erneut accures. nicht? (alles andere löst Session_End Ereignis aus)
Backdoor
Session.Clear entfernt nur Elemente aus der Sitzung. Nichts mehr. Sie können es so oft wie nötig aufrufen.
Dmytrii Nagirniak
@AnthonyWJones, Sie haben Recht, "zerstören" ist falsch zu sagen. Besser ist es, Objekte aus der Sitzung zu entfernen. Session.Clear zerstört jedoch auch keine Objekte, sondern entfernt sie aus der Sitzung, damit sie durch Müll gesammelt werden können. Das Speichern von COMPLEX-Objekten wird ebenfalls nicht empfohlen, da ich es sonst für in Ordnung halte.
Dmytrii Nagirniak
@Dmitriy: Warum wird das Speichern von KOMPLEXEN Objekten nicht empfohlen?
Kamarey
5
@Ads Ich stimme zu, obwohl ich es erweitern würde, indem ich sage, dass Session.Cleardies mit dem sofortigen Entfernen aller Bücher aus dem Regal verglichen werden kann , während Session.Abandones eher so ist , als würde man sagen "Wirf das ganze Regal weg und lass es mich wissen, wenn du fertig bist ".
WynandB
20

Wenn Sie Abandon()eine Sitzung durchführen, erhalten Sie (oder besser gesagt der Benutzer) eine neue Sitzungs-ID (bei der nächsten Anforderung). Wenn Sie Clear()eine Sitzung durchführen, werden alle gespeicherten Werte entfernt, die Sitzungs-ID bleibt jedoch erhalten.

Hans Keing
quelle
3
Vielen Dank. Laut Matt Macdonalds Buch kann jedoch dieselbe Sitzungs-ID verwendet werden. i bedeuten , dass wenn regenerateExpiredSessionId Attribut bei der Konfiguration / system.web / session Elemente in web.config - Datei falsch ist ASP.Net alte Session - ID verwendet
Backdoor
2
@ Hans Kesting Er erhält keine neue Sitzungs-ID, wenn Abbruch aufgerufen wird. Er muss das Cookie ASPNET_SessionID explizit auf null setzen, um eine neue Sitzungs-ID zu erhalten.
Zo hat
9

Dies ist Art von oben durch die verschiedenen Antworten bedeckt, aber das erste Mal , dass ich diesen Artikel gelesen habe ich verpasst eine wichtige Tatsache, die zu einem kleinen Fehler in meinem Code geführt ...

Session.Clear() löscht die Werte aller Schlüssel, löst jedoch NICHT das Ereignis zum Beenden der Sitzung aus.

Session.Abandon()löscht NICHT die Werte der aktuellen Anforderung. Wenn eine andere Seite angefordert wird, werden die Werte für diese Seite gelöscht. Verlassen Sie jedoch wird das Ereignis werfen.

Also, in meinem Fall (und vielleicht in Ihrem?) Musste ich Clear()gefolgt von Abandon().

NRC
quelle
1
Warum benötigen Sie Session.Clear () gefolgt von Session.Abandon ()? Sie löschen Werte einer Sammlung, die Sie zerstören? Dies ist völlig überflüssig. Sicher, das Sitzungsobjekt wird nicht sofort zerstört (dies geschieht am Ende der aktuellen Anforderung), aber diese Sitzungs-ID wird von keiner nachfolgenden Anforderung mehr bedient. Wenn der Client eine neue Anfrage stellt, wird ihm eine neue Sitzung gegeben. Das erste Aufrufen von Clear führt auch zu Problemen, wenn Sie auf Sitzungsvariablen im Ereignis Session_End () von Global.Asax zugreifen möchten (diese sind nicht vorhanden, weil Sie sie gelöscht haben).
RepDbg
@RepDbg eigentlich bin ich nicht einverstanden. Session.Abandon (). gibt dem Client eine neue Sitzungs-ID. Session.clear löscht alle Informationen auf dem Server über die Sitzung, so dass keine anderen Benutzer dies können. Ich stimme NRC
Micah Armantrout
@ Micah Armantrout Ich folge nicht deiner Logik. Warum eine Sitzung mit Session.Clear () löschen und dann Session.Abandon () aufrufen, wodurch die Sitzung nicht nur gelöscht, sondern auch vollständig freigegeben wird? Auch Session.Abandon () gibt dem Client keine neue Sitzungs-ID. Eine nachfolgende Anfrage wird, aber nicht die Erfüllung der Anfrage, die Session.Abandon () aufgerufen hat.
RepDbg
Wenn Sie nur Session.Abandon verwenden, kann andere verbleibende Logik in der ASP.NET-Pipeline weiterhin auf die aktuellen Sitzungswerte zugreifen.
Mark Sowul
6

Dieser Code funktioniert und löst keine Ausnahme aus:

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

Dies liegt daran, dass beim Aufrufen der Abandon-Methode das aktuelle Sitzungsobjekt zum Löschen in die Warteschlange gestellt wird, jedoch erst dann gelöscht wird, wenn alle Skriptbefehle auf der aktuellen Seite verarbeitet wurden. Dies bedeutet, dass Sie auf Variablen zugreifen können, die im Sitzungsobjekt auf derselben Seite wie der Aufruf der Abandon-Methode gespeichert sind, jedoch nicht auf nachfolgenden Webseiten.

Im folgenden Skript wird beispielsweise in der dritten Zeile der Wert Mary gedruckt. Dies liegt daran, dass das Sitzungsobjekt erst zerstört wird, wenn der Server die Verarbeitung des Skripts abgeschlossen hat.

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

Wenn Sie auf einer nachfolgenden Webseite auf die Variable MyName zugreifen, ist diese leer. Dies liegt daran, dass MyName mit dem vorherigen Sitzungsobjekt zerstört wurde, als die Seite mit dem vorherigen Beispiel die Verarbeitung beendet hat.

von MSDN Session.Abandon

Sieben
quelle
3

Durch das Löschen einer Sitzung werden die dort gespeicherten Werte entfernt, Sie können dort jedoch immer noch neue hinzufügen. Nach dem Zerstören der Sitzung können Sie dort keine neuen Werte hinzufügen.

RaYell
quelle
Danke, aber das funktioniert: (widerspricht Ihrer Idee) Session.Abandon (); Session ["tempKey1"] = "tempValue1"; Response.Write (Session ["tempKey1"]. ToString ());
Hintertür
Dies liegt daran, dass die Sitzung zerstört wird, nachdem Sie Ihre Seite tatsächlich aktualisiert haben. Die Sitzungs-ID wird (normalerweise) in einem Cookie gespeichert.
RaYell
Ich verstehe nicht. Ich meine, nachdem ich Session.Abandon () aufgerufen habe, kann ich noch Werte hinzufügen. (auch wenn die Seite zurück gepostet und wieder gerendert wird).
Hintertür
1
Möglicherweise ist Ihre Sitzung so eingestellt, dass sie die ID nach der Zerstörung automatisch neu generiert. Wenn Sie der zerstörten Sitzung einen Wert zuweisen, wird automatisch eine neue Sitzung generiert.
RaYell
1
Ja, die Verwendung dieser Sitzungs-ID wird neu generiert, aber meine Frage lautet: Was unterscheidet sich überhaupt zwischen session.clear () und session.abandone ()? Auf diese Weise unterscheiden sich diese Schlepptauarten nicht in irgendetwas anderem, was Sesion_End auslöst, wenn autoregenerate auf false gesetzt ist.
Hintertür
3

Löschen Sie den Schlüssel oder die Werte aus der Sitzungsstatuserfassung.

Abbruch - Entfernen oder Löschen von Sitzungsobjekten aus der Sitzung.

maxy
quelle
1
Session.Abandon() 

wird die gesamte Sitzung zerstören / töten.

Session.Clear()

Entfernt / löscht die Sitzungsdaten (dh die Schlüssel und Werte aus der aktuellen Sitzung), aber die Sitzung ist aktiv.

Im Vergleich zur Session.Abandon () -Methode erstellt Session.Clear () keine neue Sitzung, sondern setzt alle Variablen in der Sitzung auf NULL.

Die Sitzungs-ID bleibt in beiden Fällen gleich, solange der Browser nicht geschlossen ist.

Session.RemoveAll()

Es entfernt alle Schlüssel und Werte aus der Sitzungsstatuserfassung.

Session.Remove()

Es löscht ein Element aus der Sitzungsstatuserfassung.

Session.RemoveAt()

Es löscht ein Element an einem angegebenen Index aus der Sitzungsstatuserfassung.

Session.TimeOut()

Diese Eigenschaft gibt den Zeitüberschreitungszeitraum an, der dem Sitzungsobjekt für die Anwendung zugewiesen ist. (Die Zeit wird in Minuten angegeben).

Wenn der Benutzer innerhalb des Zeitlimits keine Seite aktualisiert oder anfordert, endet die Sitzung.

Laxmi
quelle
0

Das Vorhandensein einer Sitzungs-ID kann zu einem Angriff auf die Sitzungsfixierung führen, der einer der Gründe für die PCI-Konformität ist. Lesen Sie diese Lösung , um die Sitzungs- ID zu entfernen und den Angriff auf die Sitzungsfixierung zu überwinden. - Wie vermeide ich die Sicherheitsanfälligkeit bezüglich der Sitzungsfixierung in ASP.NET? .

Sheo Narayan
quelle
0

Ich denke, es wäre praktisch zu verwenden, Session.Clear()anstatt zu verwenden Session.Abandon().

Weil die Werte nach einem späteren Aufruf noch in der Sitzung vorhanden sind, aber nach dem Aufruf des ersteren entfernt werden.

Pra
quelle
0
this code works and dont throw any exception:

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

Hierbei ist zu beachten, dass Session.Clear Elemente sofort entfernt, Session.Abandon jedoch die Sitzung markiert, die am Ende der aktuellen Anforderung abgebrochen werden soll. Das bedeutet einfach, dass Sie, nachdem Sie den Befehl session.abandon ausgeführt haben, versucht haben, auf den Wert im Code zuzugreifen, dieser weiterhin vorhanden ist. Seien Sie also nicht verwirrt, wenn Ihr Code auch nach der Ausgabe des Befehls session.abandon und der sofortigen Ausführung einer Logik mit der Sitzung nicht funktioniert.

Biki
quelle