ASP.NET中Cookie跨域的問題及解決代碼


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跨域跨目錄
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM