设置了Cookie的域为abc.com,在浏览器里查看,设置成功了,可以看到,但是,取Cookie值的时候就出问题了,Cookie值可以取到,但是cookie域一直是null,而且如果把过期时间改成2013年,再次查看,时间改了,但是浏览器里还能找到这个Cookie,请高手指教
1 public void Delete(string key, string domain) 2 { 3 var cook = GetCookie(key); 4 if (cook != null && cook.Domain == domain) 5 { 6 cook.Expires = DateTime.Now.AddYears(-1); 7 this.httpContext.Response.Cookies.Add(cook); 8 } 9 } 10 11 12 public string Get(string key) 13 { 14 var cook = GetCookie(key); 15 16 if (cook != null) 17 return HttpUtility.UrlDecode(cook.Value); 18 19 return null; 20 } 21 22 /// <summary> 23 /// 24 /// </summary> 25 /// <param name="key"></param> 26 /// <returns></returns> 27 HttpCookie GetCookie(string key) 28 { 29 return this.httpContext.Request.Cookies[key]; 30 } 31 32 public void Add(string key, string value, string domain, double expminute) 33 { 34 if (string.IsNullOrWhiteSpace(key)) 35 throw new ArgumentNullException("key"); 36 if (string.IsNullOrWhiteSpace(value)) 37 throw new ArgumentNullException("value"); 38 39 var cookie = this.GetCookie(key); 40 if (cookie == null) 41 cookie = new HttpCookie(key); 42 43 lock (objLocker) 44 { 45 cookie.Expires = DateTime.Now.AddMinutes(expminute <= 0 ? Variables.COOKIEMINUTE : expminute); 46 if (!string.IsNullOrWhiteSpace(domain)) 47 cookie.Domain = domain; 48 49 cookie.Value = HttpUtility.UrlEncode(value); 50 51 this.httpContext.Response.Cookies.Add(cookie); 52 } 53 }
代码看起来没问题。
注意以下几个细节:
1、cook.Domain == domain
这个Domain是统一小写或大写或大小写是匹配的?最好使用String.Equals不区分大小写的比较相等性
2、关于Cookie.Domain
这个是限制Cookie域的,输出时能正确的处理,但是获取就有问题。
浏览器的安全机制限制了,如果cookie的domain与当前访问的站点的cookie是不一致(不兼容)的话,是不会提交给服务器的。
所谓的一致,自然是完全相等(不区分大小写),所谓的兼容,是指子域站点能获取父域站点的cookie,但父域不能获取子域的站点。
关于子域与父域,包括站点中的虚拟站点、域名中的子域名等。
虽然还没解决,还是谢谢