ASP.NET Session state

 

Kolejna odsłona z cyklu pod tytułem: co każdy programista ASP.NET musi wiedzieć. Tym razem niezbyt długi post o jednym z mechanizmów zarządzania stanem aplikacji odbywającym się po stronie serwera, czyli o stanie sesji (session state). Poruszone zostaną w nim jedynie podstawowe kwestie, być może w późniejszym czasie do zagadnienia tego powrócę.

Stan sesji w ASP.NET umożliwia przechowywanie wartości specyficznych dla użytkownika w momencie, gdy porusza się on po stronach aplikacji. Pamiętamy o tym, że protokół HTTP jest bezstanowy, przez co wprowadzenie różnych mechanizmów zarządzania sesją jest konieczne, aby można było przechować jakiekolwiek wartości pomiędzy kolejnymi żądaniami. Wartości przechowywane za pomocą zmiennych sesyjnych są dostępne typowo do momentu zamknięcia przeglądarki. Możliwe jest również ustalenie czasu trwania sesji oraz jej wcześniejsze zakończenie.

W wielu miejscach można spotkać się ze stwierdzeniem, że przechowywanie zmiennych za pomocą stanu sesji jest najpowszechniej wykorzystywanym mechanizmem zarządzania stanem. Do czego mogłoby to być wykorzystane w tworzonej przeze mnie aplikacji? Np. do przechowywania danych wprowadzonych do formularza przez użytkownika, które mogłyby być wyświetlone na innej stronie. Załóżmy, dla ustalenia uwagi, że będzie to adres zamieszkania użytkownika.

Zmienne sesyjne na stronie ASP.NET dostępne są za pomocą właściwości Session dla obiektu Page. Zmienne sesyjne nie muszą być deklarowane, a ich tworzenie odbywa się poprzez wykorzystanie indeksu typu integer lub typu string. Drugi ze sposobów, czyli odwołanie poprzez nazwę zmiennej, wygląda następująco:

Session["Address"] = TextBox1.Text;
W tym przypadku zmiennej sesyjnej o nazwie “Address” przypisana została wartość typu string. Warto jednak podkreślić, że zmienne sesyjne mogą być dowolnego typu (przy domyślnym trybie sesji). Można zatem przechowywać obiekty własnego typu. Sprawdźmy to tworząc własną klasę przechowującą dane osoby:
public partial class Person
{
    protected string firstName;
    protected string lastName;

    //Constructors
    ...

    //Class variables exposed by standard properties
    public string FirstName
    {
        ...
    }

    public string LastName
    {
        ...
    }
}
Po stworzeniu odpowiedniego kodu okazuje się, że poniżej przedstawione przypisanie jest jak najbardziej poprawne:
Person p1 = new Person("Walt", "Kowalsky");
Session["person1"] = p1;
Odczytanie tak utworzonych zmiennych wymaga natomiast rzutowania:
if (Session["person1"] != null)
{
    Person p1 = (Person)Session["person1"];
    this.Label3.Text = p1.FirstName + " " + p1.LastName;
}
Sesje identyfikowane są poprzez unikalny identyfikator sesji (SessionID), który jest analizowany w trakcie każdego odwołania. Kłopot jednak w tym, że domyślnie wartości SessionID są przechowywane jako niewygasające w trakcie sesji ciasteczko (cookie). Jeśli zatem przeglądarka blokuje akceptowanie ciasteczek, przekazywanie zmiennych za pomocą tak skonfigurowanej sesji jest niemożliwe. Z pomocą przychodzi tutaj możliwość przechowywania wartości SessionID poprzez adres URL. Zagadnienie bezpieczeństwa takiego rozwiązania pozostawiam do samodzielnego zgłębienia.
 

Sesję można zakończyć wcześniej niż zamknięciem przeglądarki, poprzez wykorzystanie metody Abandon(). Aby mieć jednak pewność, że nie będzie możliwe uzyskanie żadnych danych z poprzedniej sesji należy również wyzerować domyślne ciasteczko dla sesji. Przykładowy proces wylogowania użytkownika z aplikacji może mieć następującą postać:

protected void Button1_Click(object sender, EventArgs e)
{
    Session.Abandon();
    Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));

    //Needed because postback is executed earlier then Abandon
    Response.Redirect(Request.Url.ToString());
}
Jak powiedziałem na początku, przedstawiłem jedynie podstawowe zagadnienia dotyczące stanu sesji, które umożliwiają rozpoczęcie pracy z wykorzystaniem tego mechanizmu. Po nieco więcej informacji zapraszam do materiału źródłowego: http://msdn.microsoft.com/en-us/library/ms178581(v=VS.90).aspx i np. do odrobinę bardziej zaawansowanej literatury http://support.microsoft.com/kb/899918
Reklamy

One Response to ASP.NET Session state

  1. Dzięki, ponownie się przydało.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d blogerów lubi to: