ASP.NET中Cookie跨域的問題及解決代碼
http://www.liyumei.net.cn/post/share18.html
Cookies揭秘
http://www.cnblogs.com/zhangziqiu/archive/2009/08/06/cookies-javascript-aspnet.html

最近在項目開發中遇到一個很棘手的問題,一個用戶在頂級域名登錄后,跳轉到自己所擁有的二級域名下管理二級網站時,cookie丟失了,一直找解決辦法找了整整兩天,百度谷歌一大堆,最終還是沒解決。雖然結果讓人不滿意,不過最后學的東西還是有的,至少知道了幾種大家認為能解決問題的方法(雖然在我自己的項目中不能用)。下面IT博客分享一種比較普遍而且被大多數認可的方法以及解決代碼。 大家都知道在默認情況下,Cookie與特定的域相關聯。例如,IT博客的站點是www.liyumei.net.cn,那么當用戶向該站點請求頁面時,編寫的Cookie就被發送到服務器。(有特定路徑值的Cookie除外)。 如果我們的站點有子域(例如liyumei.net.cn、a.liyumei.net.cn和b.liyumei.net.cn),要想把Cookie同特定的子域相關聯,我們需要設置Cookie的 Domain 屬性,如下所示: Response.Cookies( "domain ").Value = DateTime.Now.ToString Response.Cookies( "domain ").Expires = DateTime.Now.AddDays(1) Response.Cookies( "domain ").Domain = "b.liyumei.net.cn" 如果按照這種方式設置域,則Cookie只能用於指定子域中的頁面。 當然我們也可以利用Domain屬性來創建可在多個子域中共享的Cookie。例如,對域進行如下設置: Response.Cookies( "domain ").Value = DateTime.Now.ToString Response.Cookies( "domain ").Expires = DateTime.Now.AddDays(1) Response.Cookies( "domain ").Domain = "liyumei.net.cn" 這樣,該 Cookie 就可用於主域、a.liyumei.net.cn和 b.liyumei.net.cn。 以下是創建一個跨域的Cookie,可以實現同一個根域下的Cookie 如:www.liyumei.net.cn,在這個根域下的所有二級域名可共享Cookie, public static bool CreateCookie(string strCookieName, string strCookieValue, string strDomain, bool blURLEncode) { if (blURLEncode) { strCookieValue = System.Web.HttpContext.Current.Server.UrlEncode(strCookieValue); } HttpCookie objCookie = new HttpCookie(strCookieName, strCookieValue); objCookie.Domain = strDomain; //設置Cookie的域名 System.Web.HttpContext.Current.Response.Cookies.Add(objCookie); return true; } Cookie有三個屬性需要注意一下: 1. Domain 域 2. Path 路徑 3. Expires 過期時間 跨域操作需要設置域屬性: Response.Cookies("MyCookie").Domain = "cnblogs.com"; (這里指的是泛域名) 這樣在其它二級域名下就都可以訪問到了, ASP 和 ASP.NET 測試通過 虛擬目錄下訪問: 我在ASP端做了下測試,.NET的沒試, 如果不指定Path屬性, 不同虛擬目錄下Cookie無法共享 將Response.Cookies("MyCookie").Path = "/" 就可以了 總的寫法: Response.Cookies("MyCookie").Domain = "cnblogs.com"; Response.Cookies("MyCookie").Path = "/" Response.Cookies("MyCookie").Expires = Now + 365; Response.Cookies("MyCookie")("Test") = "test"; .NET 清除Cookie HttpCookie cookie = System.Web.HttpContext.Current.Request.Cookies[cookiename]; if (cookie != null) { cookie.Values.Clear(); SetUserCookieExpireTime(cookiename, -1); cookie.Domain = _domain; System.Web.HttpContext.Current.Response.Cookies.Set(cookie); } public static void SetUserCookieExpireTime(string key, int days) { System.Web.HttpContext.Current.Response.Cookies[key].Domain = _domain; System.Web.HttpContext.Current.Response.Cookies[key].Path = _cookiepath; System.Web.HttpContext.Current.Response.Cookies[key].Expires = DateTime.Now.AddDays(days); } .NET 添加/更新Cookie public static void AddUserCookies(string key,string value, string cookiename, string domain) { HttpCookie cookie = System.Web.HttpContext.Current.Request.Cookies[cookiename]; if (cookie == null) { cookie = new HttpCookie(cookiename); cookie.Domain = domain; cookie.Path = _cookiepath; cookie.Values.Add(key, value); HttpContext.Current.Response.AppendCookie(cookie); } else { if (System.Web.HttpContext.Current.Request.Cookies[cookiename].Values[key] != null) { cookie.Values.Set(key, value); } else { cookie.Domain = domain; cookie.Path = _cookiepath; cookie.Values.Add(key, value); HttpContext.Current.Response.AppendCookie(cookie); } } } 以上這種寫法可以實現cookie跨域跨目錄