Sušenky.NET

Ačkoliv ASP.NET samy řeší řadu úloh, ke kterým se zpravidla používají cookies, představují HTTP sušenky užitečný způsob, jak si klienta "označkovat" a příště ho zase poznat. Implementace práce s cookies v ASP.NET ovšem neskrývá jisté záludnosti. Pokud se chcete dozvědět něco málo o základních principech fungování cookies, přečtěte si článek dříve vydaný na ASP Network. Týká se sice klasických ASP 3.0, ale princip je pořád stejný.

Request.Cookies vs. Response.Cookies

Cookies jsou v prostředí .NET reprezentovány třídami System.Web.HttpCookie a System.Web.HttpCookieCollection. Kolekce cookies jsou dostupné jako vlastnosti Request.Cookies a Response.Cookies - a v tom je právě kámen úrazu. Rozumný člověk by předpokládal, že kolekce dostupná pomocí Request bude read only obsahovat přijaté cookies, a že do Response se tyto jaksi iniciálně přepíší a následně se modifikovány pošlou na klienta.

V praxi je tomu tak, že s kolekcí v Request sice manipulovat můžete do alelujá, ale neuloží se, a kolekce v Response je prázdná a když s ní něco provedetem, občas se to do Request zpropaguje a občas ne  (pokud přidáte cookie tak ano, pokud jenom změníte hodnotu tak ne).

Path, Domain a Expires

Kromě vlastnosti Value (resp. kolekce Values) má HttpCookie ještě tři užitečné vlastnosti:

Path - cestu v rámci webu, ve které je cookie čitelná. Standardně je hodnota nastavena na /, což znamená, že hodnotu může číst kterákoliv stránka v rámci webu. Pokud vaše aplikace běží v podadresáři, můžete chtít aby ostatní aplikace tuto cookie číst nemohly.

Domain - platnost cookie je standardně omezena na server, který ji zaslal. Můžete ovšem nastavit platnost v rámci celé domény druhé a nižší úrovně. To lze, pokud má vaše doména druhé úrovně alespoň čtyři znaky (aby nebylo možno nastavit domain-wide cookie pro ty TLD, které neumožňují přímou registraci domén druhé úrovně, např. co.uk). Pokud tedy chcete, aby hodnota cookie byla sdílena mezi více stroji v jedné doméně (např. www.aspnet.cz a necojineho.aspnet.cz), nastavte vlastnost Domain na hodnotu "aspnet.cz".

Expires - pokud necháte hodnotu prázdnou (potažmo DateTime.MinValue), cookie bude tzv. per-session. Neuloží se na disk klientského počítače, ale jenom do paměti a bude při zavření okna prohlížeče odstraněna. Pokud chcete cookie smazat, nastavte její hodnotu Expires do minulosti.

Užitečné funkce

Následujících několik funkcí vám zpříjemní práci s cookies a ošetřování chybových stavů (když cookie neexistuje). Předpkládám, že kód nepotřebuje komentář

Public Shared Function GetCookie(ByVal Key1 As String, ByVal Key2 As String, Optional ByVal DefaultValue As String = "") As String
    Try
        Return System.Web.HttpContext.Current.Request.Cookies(Key1).Item(Key2)
    Catch
        Return DefaultValue
    End Try
End Function

Public Shared Sub SetCookie(ByVal Key1 As String, ByVal Key2 As String, ByVal Value As String, Optional ByVal DaysToExpire As Int32 = 90)
    Dim C As System.Web.HttpCookie

    C = System.Web.HttpContext.Current.Request.Cookies.Get(Key1)
    If C Is Nothing Then C = New System.Web.HttpCookie(Key1)

    Try
        C.Values.Item(Key2) = Value
    Catch
        C.Values.Add(Key2, Value)
    End Try

    C.Expires = DateTime.Now.AddDays(DaysToExpire)
    System.Web.HttpContext.Current.Response.Cookies.Add(C)
End Sub

Public Shared Sub DeleteCookie(ByVal Name As String)
    Dim C As System.Web.HttpCookie = System.Web.HttpContext.Current.Request.Cookies.Get(Name)
    If C Is Nothing Then Return
    C.Expires = DateTime.Now.AddDays(-1)
    System.Web.HttpContext.Current.Response.Cookies.Add(C)
End Sub
  • Altairis
  • Nemesis
  • Microsoft MVP
  • IIS
  • ASP.NET