Jaka jest różnica między zniszczeniem sesji a usunięciem jej wartości? Czy możesz podać przykład, który to potwierdza?
Szukałem tego pytania, ale nie rozumiem pełnej odpowiedzi. Oto niektóre odpowiedzi:
Session.Abandon()
niszczy sesjęSession.Clear()
po prostu usuwa wszystkie wartości
Znajomy powiedział mi to:
Wyczyszczenie sesji nie powoduje usunięcia sesji, nadal istnieje ona z tym samym identyfikatorem użytkownika, ale z wartościami po prostu wyczyszczonymi.
Porzucenie całkowicie zniszczy sesję, co oznacza, że musisz rozpocząć nową sesję, zanim będziesz mógł przechowywać więcej wartości w sesji dla tego użytkownika.
Poniższy kod działa i nie zgłasza żadnych wyjątków.
Session.Abandon();
Session["tempKey1"] = "tempValue1";
Kiedy porzucisz () sesję, ty (a raczej użytkownik) otrzymasz nowy identyfikator sesji
Kiedy testuję sesję, nie wprowadza żadnych zmian, kiedy opuszczam sesję.
Widzę tylko jedną różnicę:
session.Abandon()
podnosi Session_End
wydarzenie
źródło
Odpowiedzi:
Wyczyść - usuwa wszystkie klucze i wartości z kolekcji stanu sesji.
Porzuć - usuwa wszystkie obiekty przechowywane w sesji. Jeśli nie wywołasz metody Abandon jawnie, serwer usunie te obiekty i zniszczy sesję po przekroczeniu limitu czasu sesji.
Podnosi również zdarzenia, takie jak Session_End .
Session.Clear można porównać do usunięcia wszystkich książek z półki , podczas gdy Session.Abandon bardziej przypomina wyrzucenie całej półki .
Mówisz:
Jest to poprawne, jeśli robisz to tylko w ramach jednego żądania .
Na następne żądanie sesja będzie inna. Ale identyfikator sesji można ponownie wykorzystać, aby pozostał taki sam.
Jeśli będziesz używać Session.Clear, będziesz mieć tę samą sesję w wielu żądaniach.
Ogólnie rzecz biorąc, w większości przypadków musisz użyć Session.Clear.
Możesz użyć Session.Abandon, jeśli masz pewność, że użytkownik opuści Twoją witrynę.
Wróćmy więc do różnic:
źródło
Session.Clear
można porównać do usuwania wszystkich książek z półki natychmiast , natomiastSession.Abandon
jest bardziej jak powiedzenie „wyrzucić całą półkę i daj mi znać, kiedy skończysz ”.Kiedy jesteś
Abandon()
sesją, ty (a raczej użytkownik) otrzymasz nowy identyfikator sesji (przy następnym żądaniu). Gdy jesteśClear()
sesją, wszystkie zapisane wartości są usuwane, ale SessionId pozostaje nienaruszone.źródło
Jest to w pewnym sensie omówione w różnych odpowiedziach powyżej, ale gdy po raz pierwszy przeczytałem ten artykuł, przegapiłem ważny fakt, który doprowadził do drobnego błędu w moim kodzie ...
Session.Clear()
CZYŚCI wartości wszystkich kluczy, ale NIE spowoduje wywołania zdarzenia zakończenia sesji.Session.Abandon()
NIE wyczyści wartości w bieżącym żądaniu. JEŻELI zażądana zostanie kolejna strona, wartości dla tej strony zostaną utracone. Jednak porzucić BĘDZIE rzucić wydarzenie.Tak więc w moim przypadku (a może w twoim?) Musiałem
Clear()
śledzićAbandon()
.źródło
Dzieje się tak, ponieważ wywołanie metody Abandon powoduje, że bieżący obiekt Session jest umieszczany w kolejce do usunięcia, ale w rzeczywistości nie jest usuwany, dopóki nie zostaną przetworzone wszystkie polecenia skryptu na bieżącej stronie. Oznacza to, że można uzyskać dostęp do zmiennych przechowywanych w obiekcie Session na tej samej stronie, co wywołanie metody Abandon, ale nie na kolejnych stronach sieci Web.
Na przykład w poniższym skrypcie trzecia linia wypisuje wartość Mary. Dzieje się tak, ponieważ obiekt Session nie jest niszczony, dopóki serwer nie zakończy przetwarzania skryptu.
Jeśli uzyskasz dostęp do zmiennej MyName na kolejnej stronie sieci Web, jest ona pusta. Dzieje się tak, ponieważ MyName zostało zniszczone przez poprzedni obiekt Session, gdy strona zawierająca poprzedni przykład zakończyła przetwarzanie.
z MSDN Session.Abandon
źródło
Wyczyszczenie sesji usuwa wartości, które były tam przechowywane, ale nadal możesz tam dodawać nowe. Po zniszczeniu sesji nie możesz dodać tam nowych wartości.
źródło
wyczyść klucz lub wartości z kolekcji stanu sesji.
porzucić - usunąć lub usunąć obiekty sesji z sesji.
źródło
zniszczy / zabije całą sesję.
usuwa / czyści dane sesji (tj. klucze i wartości z bieżącej sesji), ale sesja będzie żyła.
W porównaniu z metodą Session.Abandon (), Session.Clear () nie tworzy nowej sesji, po prostu zmienia wszystkie zmienne w sesji na NULL.
Identyfikator sesji pozostanie taki sam w obu przypadkach, o ile przeglądarka nie zostanie zamknięta.
Usuwa wszystkie klucze i wartości z kolekcji stanu sesji.
Usuwa element z kolekcji stanu sesji.
Usuwa element o określonym indeksie z kolekcji stanu sesji.
Ta właściwość określa limit czasu przypisany do obiektu Session dla aplikacji. (czas zostanie określony w minutach).
Jeśli użytkownik nie odświeży ani nie zażąda strony w określonym czasie, sesja kończy się.
źródło
Istnienie sessionid może spowodować atak fiksacji sesji, który jest jednym z punktów zgodności PCI. Aby usunąć identyfikator sesji i przezwyciężyć atak polegający na utrwalaniu sesji, przeczytaj to rozwiązanie - Jak uniknąć luki w zabezpieczeniach naprawy sesji w programie ASP.NET? .
źródło
Myślę, że przydałoby się
Session.Clear()
raczej używać niż używaćSession.Abandon()
.Ponieważ wartości nadal istnieją w sesji po późniejszym wywołaniu, ale są usuwane po wywołaniu pierwszego.
źródło
Należy tu zauważyć, że Session.Clear usuwa elementy natychmiast, ale Session.Abandon oznacza sesję do porzucenia na koniec bieżącego żądania. Oznacza to po prostu, że przypuśćmy, że próbowałeś uzyskać dostęp do wartości w kodzie tuż po wykonaniu polecenia session.abandon, nadal będzie tam. Więc nie daj się zmylić, jeśli twój kod po prostu nie działa nawet po wydaniu polecenia session.abandon i natychmiastowym wykonaniu logiki z sesją.
źródło