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,但是可以增加通过脚本直接获取的难度。

猜你喜欢

转载自www.cnblogs.com/huangshuqiang/p/10252782.html