1. 程式人生 > >js無法獲取.net設定的cookie

js無法獲取.net設定的cookie

使用CookieHelper幫助類:

public class CookieHelper
    {

        #region 獲取Cookie


        /// <summary> 
        /// 獲得Cookie的值 
        /// </summary> 
        /// <param name="cookieName"></param> 
        /// <returns></returns> 
        public static string GetCookieValue(string
cookieName) { 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,但是可以增加通過指令碼直接獲取的難度。