js無法獲取.net設定的cookie
阿新 • • 發佈:2019-01-10
使用CookieHelper幫助類:
public class CookieHelper { #region 獲取Cookie /// <summary> /// 獲得Cookie的值 /// </summary> /// <param name="cookieName"></param> /// <returns></returns> public static string GetCookieValue(stringcookieName) { HttpRequest request = HttpContext.Current.Request; if (request != null) return GetCookieValue(request.Cookies[cookieName]); return ""; } /// <summary> /// 獲得Cookie的值 /// </summary> ///<param name="cookie"></param> /// <returns></returns> public static string GetCookieValue(HttpCookie cookie) { if (cookie != null) { return cookie.Value; } return ""; } /// <summary>/// 獲得Cookie /// </summary> /// <param name="cookieName"></param> /// <returns></returns> public static HttpCookie GetCookie(string cookieName) { HttpRequest request = HttpContext.Current.Request; if (request != null) return request.Cookies[cookieName]; return null; } #endregion #region 刪除Cookie /// <summary> /// 刪除Cookie /// </summary> /// <param name="cookieName"></param> public static void RemoveCookie(string cookieName) { HttpResponse response = HttpContext.Current.Response; if (response != null) { HttpCookie cookie = response.Cookies[cookieName]; if (cookie != null) { response.Cookies.Remove(cookieName); } } } #endregion #region 設定/修改Cookie /// <summary> /// 設定Cookie /// </summary> /// <param name="cookieName"></param> /// <param name="key"></param> /// <param name="value"></param> /// <param name="expires"></param> public static void SetCookie(string cookieName,string value, DateTime? expires) { Guard.IsNotNullOrEmpty(cookieName, "cookieName"); HttpResponse response = HttpContext.Current.Response; if (response != null) { HttpCookie cookie = response.Cookies[cookieName]; if (cookie != null) { cookie.Value = value; if (expires != null) cookie.Expires = expires.Value; response.SetCookie(cookie); } } } #endregion #region 新增Cookie /// <summary> /// 新增為Cookie.Values集合 /// </summary> /// <param name="cookieName"></param> /// <param name="key"></param> /// <param name="value"></param> /// <param name="expires"></param> public static void AddCookie(string cookieName, string value, DateTime expires) { Guard.IsNotNullOrEmpty(cookieName, "cookieName"); HttpCookie cookie = new HttpCookie(cookieName); cookie.Expires = expires; cookie.Value = value; AddCookie(cookie); } /// <summary> /// 新增Cookie /// </summary> /// <param name="cookie"></param> public static void AddCookie(HttpCookie cookie) { HttpResponse response = HttpContext.Current.Response; if (response != null) { //指定客戶端指令碼是否可以訪問[預設為false] cookie.HttpOnly = true; //指定統一的Path,比便能通存通取 cookie.Path = "/"; //設定跨域,這樣在其它二級域名下就都可以訪問到了 //cookie.Domain = "nas.com"; response.AppendCookie(cookie); } } #endregion }
設定cookie:
public static string VCLoginName { get { try { return CookieHelper.GetCookieValue("VCLoginName").ToStr(); } catch { return "0"; } } set { var cookie = CookieHelper.GetCookie("VCLoginName"); if (cookie != null) { CookieHelper.SetCookie("VCLoginName", value, DateTime.Now.AddHours(1)); } else { //有效期,一個鐘頭 CookieHelper.AddCookie("VCLoginName", value, DateTime.Now.AddHours(1)); } } }
設定:
SysContext.VCLoginName = user.LoginName;
js獲取和設定cookie:
function getCookie(cname) { console.log("開始") console.log(document.cookie) console.log("結束") var arrStr = document.cookie.split("; "); for (var i = 0; i < arrStr.length; i++) { var temp = arrStr[i].split("="); if (temp[0] == cname) return unescape(temp[1]); } } //新增cookie function addCookie(cname, cvalue, ctime) { var str = cname + "=" + escape(cvalue); if (ctime > 0) { //為時不設定過期時間,瀏覽器關閉時cookie自動消失 var date = new Date(); var ms = ctime * 3600 * 1000; date.setTime(date.getTime() + ms); str += "; expires=" + date.toGMTString(); alert(cname + cvalue); } document.cookie = str; }
遇到的問題:
後臺設定cookie但是通過js無法獲取相應的cookie的值,why?
不知道。但是自己在一般處理程式中寫的cookie卻可以通過js獲得。why?
HttpCookie cookie = new HttpCookie("LoginName", HttpUtility.UrlEncode(username)); //定義cookie物件以及名為DocUrl的項 DateTime dt = DateTime.Now; //定義時間物件 TimeSpan ts = new TimeSpan(0, 12, 20, 0); //天,小時,分鐘,秒 ,cookie有效作用時間 cookie.Expires = dt.Add(ts); //新增作用時間 context.Response.AppendCookie(cookie); //確定寫入cookie中
解決:
因為CookieHelper中設定了cookie的HttpOnly為true。
ASP.Net中HttpCookie物件的HttpOnly 屬性 指定一個Cookie 是否可通過客戶端指令碼訪問。不能通過客戶端指令碼訪問為 true;否則為 false。預設值為 false。此屬性並不能完全阻止客戶端在本地獲取cookies,但是可以增加通過指令碼直接獲取的難度。