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
Titulek:
Text komentáře:
Vaše jméno:
Váš e-mail: (nebude zveřejněn)

WWW stránka:
Opište text z obrázku:
odpovědětodpovědět Gravatar

Preklady nazvov

22.1.2005 4:50:5022.1.2005 4:50:50 StarlogicStarlogic ---.hsd1.ga.comcast.net

Neviem, ci tento prispevok patri prave k tomuto clanku, ale primal ma k napisaniu jeho nazov: Susenky.NET. Trvalo mi dost dlho, kym som pochopil, co to znamena - az ked som zacal citat clanok, tak som pochopil. Viem, ze neanglicky hovoriaci clovek si poklada za povinnost prekladat anglicke nazvy - ale preco susienky? Podobny pocit som mal, ked sme sa bavili s priatelom o filme, ktory sa mu pacil: Prci-prci-prcicky. "Ty si to nevidel?" - divil sa "Ved to je americky film a velmi znamy tam u vas..." - az ked mi ozrejmil dej filmu, pochopil som, ze hovori o filme American Pie. Nepochopil som vsak, kde sa vzali tie Prcicky a dokonca tri krat.

Dalsi priklad je na tomto webe: Ulozene procedury! Preco sa preklada len polovica nazvu? Ak chceme byt dosledni, tak by to malo byt Ulozene postupy. Osobne sa priklanam k neprekladaniu takychto nazvov - je to terminus technicus tak ako napr. procesor. Ten sa predsa nepreklada ako spracovatel, ci vyrobca.

A tak isto sa prihovaram k zachovaniu autorskych prav vyrobcov filmov a neprekladat ich nazvy uplne odveci. Urcite by sa cesky producenti nepotesili, keby sa v USA premietal "Cesky Sen" pod nazvom "Stupid Nation" aj ked mozno tento nazov vystihuje film presnejsie. Ale to je o inom....

Berte tento prispevok ako fejton, ci poznamku naokraj.

Pokud se týče obecně překladů názvů, snažím se dodržovat zažité konvence, ale nevymýšlet nové. Takže používám "uložené procedury", protože každý ví o čem mluvím.

Nadpis tohoto článku je - uznávám že velmi vyčichlým - pokusem o vtip. Je to tak staré, že předpokládám že každý ví, že HTTP cookies v překladu znamená "sušenky". Jinak v celém článku používám pojem Cookies, protože se obvykle nepřekládá.

odpovědětodpovědět Gravatar

RE: Preklady nazvov

12.2.2006 15:47:2212.2.2006 15:47:22 k0ndk0nd 212.47.22.---

Ja si myslim, ze to moc resis. Jinak byl clanek jednoduchy, lehce stravitelny a dobry :)

odpovědětodpovědět Gravatar

nazvy

22.1.2005 15:48:3822.1.2005 15:48:38 StarlogicStarlogic ---.hsd1.ga.comcast.net

Beriem vysvetlenie. Mozno len z pohladu cudzinca to vyzeralo trochu divne...

Děkuji, vám za vaše příspěvky, již po několikáté mi velmi pomohli.

  • Altairis
  • Nemesis
  • Microsoft MVP
  • IIS
  • ASP.NET