[C#.NET][ASP.NET] 存取 Cookie
Cookie 是瀏覽器與伺服器進行資料交換的方式,它存在於用戶電腦,用於保存網頁狀態,參考
使用 Cookie的背景及限制
https://msdn.microsoft.com/zh-tw/library/ms178194%28v=vs.100%29.aspx#Background
- 大部分 Browser 支援最多 4096 bytes 的 Cookie (個人習慣控制在 4000 bytes 以下)
- Browser 也會限制網站 Cookie數量
- 若使用者限制存取 Cookie ( 個人習慣:Session 跟 Cookie 相依,為了不讓 Session ID 曝露在 Url,所以使用者若限制存取 Cookie,就不要讓他使用服務)
- Browser 的 Cookie 限制,超過 Browser 的限制,則會拋棄舊的,可以下網站測試 Cookie 的限制
http://browsercookielimits.squawky.net/
Cookie 的屬性
- Value:只能存放字串,若需要存放物件(DTO),可使用 Json.NET 序列化字串;存放時需先使用編碼(可使用 HttpUtility.UrlEncode|HttpContext.Current.Server.UrlEncode),取出則解碼 (可使用 HttpUtility.UrlDecode|HttpContext.Current.Server.UrlDecode),
- Domain:限定特定網域存取,只有該網域能存取 (localhost 無效),若不指定,則會寫入當前網域
- Path:預設,相同網域的所有網頁會共用 Cookie;若設定特定位置(可設定虛擬目錄或是檔案路徑,有分大小寫),就能限制讀取
- Expires:若不指定到期時間,Browser 關掉就會清掉,Cookie 就不會保存在用戶端電腦上
- HttpOnly:設定true,只能給 http 使用,false 可以給JavaScript 使用,為了避免駭客偷 Cookie,會將它設為true
- Secure:是否透過 SSL 連線,但存放在 Browser 的資料仍是明碼;若設定true,當網址使用 https:// Browser 才會去 Cookie 存放區拿資料
情境:我想要驗証 Path 是否如我預期工作
- 有兩個頁面,Main.aspx、Sub.aspx
- 在 Main.aspx 寫入Cookie
- Main.aspx,可以看到 Share_Cookie 和 Main_Cookie
- Sub.aspx,可以看到 Share_Cookie 和 Sub_Cookie
核心片斷程式碼
{ SetCookieData(new Info() { Name = s_ShareName, Path = "/Login", Data = "共用 資料", Id = Guid.NewGuid(), Stamp = DateTime.Now }); SetCookieData(new Info() { Name = s_MainName, Path = "/Login/Main.aspx", Data = "@main.aspx", Id = Guid.NewGuid(), Stamp = DateTime.Now }); SetCookieData(new Info() { Name = s_SubName, Path = "/Login/Sub.aspx", Data = "@sub.aspx", Id = Guid.NewGuid(), Stamp = DateTime.Now }); } private static void SetCookieData(Info info) { var cookie = HttpContext.Current.Request.Cookies[info.Name] ?? new HttpCookie(info.Name); cookie.HttpOnly = true; cookie.Path = info.Path; var json = JsonConvert.SerializeObject(info); cookie.Value = HttpContext.Current.Server.UrlEncode(json); HttpContext.Current.Response.Cookies.Add(cookie); }
完整程式碼如下
https://dotblogsamples.codeplex.com/SourceControl/latest#Simple.OperCookie/Simple.OperCookie/Core.cs
存放 Cookie
Request Header
當我在 Main.aspx 寫入Cookie 時,也就是調用 HttpContext.Current.Response.Cookies.Add(cookie),Http Request 也會有該 Cookie,也就是 HttpContext.Current.Request.Cookies 也會擁有該 Cookie。
PS.因為網頁生命週期的關係,我目前在 Main.aspx,所以不會有 Sub_Cookie,若沒有控制好就會在 HttpContext.Current.Request.Cookies 看到不該存在的 Cookie
Response Header
Browser 收到 Set Cookie 命令後把 Cookie 存下來
讀取 Cookie
當我重新瀏覽 Main.aspx 時,Browser 會去找 Cookie 存放區有沒有符合Domain、Path、Expires、Secure,若有的話就會包在 Http Request 的 Cookie Header,當我調用 HttpContext.Current.Request.Cookies 就可以拿到所有的 Cookie
當我瀏覽 Sub.aspx 時
刪除 Cookie
由於我們不能直接控制 Browser 的 Cookie,可以設定 Cookie 的 Expires 過期,它就等於刪掉的意思
{ var cookie = HttpContext.Current.Request.Cookies[cookieName] ?? new HttpCookie(cookieName); cookie.Expires = DateTime.Now.AddDays(-1); cookie.Path = path; HttpContext.Current.Response.Cookies.Add(cookie); }
操作畫面如下:
文章出自:http://www.dotblogs.com.tw/yc421206/archive/2015/04/09/150998.aspx
專案位置:https://dotblogsamples.codeplex.com/SourceControl/latest#Simple.OperCookie/
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET