在CSDN看到一个cookie设置domain时,如何删除的问题,
自己也只知道domain设置为顶级域名时可以被其他二级域名共享,但是如何删除还是有一点搞不清楚,所以特意测试了下cookie和domain之间的关系,下面是一些测试结果的总结
设置cookie
非顶级域名,如二级域名或者三级域名,设置的cookie的domain只能为顶级域名或者二级域名或者三级域名本身,不能设置其他二级域名的cookie,否则cookie无法生成。
顶级域名只能设置domain为顶级域名,不能设置为二级域名或者三级域名,否则cookie无法生成。
如www.abc.com能设置domain为abc.com或者www.abc.com,但不能设置domain为news.abc.com,这样cookie不会生成。
hc.Domain = "news.abc.com";//////
hc.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(hc);//==========这样cookie无法生成
abc.com只能设置domain为abc.com,不能为www.abc.com等2级域名,如果设置为其他domain二级域名,cookie无法生成。
hc.Domain = "www.abc.com";///////////
hc.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(hc);//==========这样cookie无法生成
未指定domain时,默认的domain为用哪个域名访问就是哪个,如果为顶级域名访问,那么可以被其他2级域名共享。
读取cookie
二级域名能读取设置了domain为顶级域名或者自身的cookie,不能读取其他二级域名domain的cookie。所以要想cookie在多个二级域名中共享,需要设置domain为顶级域名,这样就可以在所有二级域名里面或者到这个cookie的值了。
顶级域名只能获取到domain设置为顶级域名的cookie,其他domain设置为二级域名的无法获取。
删除cookie
1)顶级域名的cookie在顶级域名或者2级域名都可以删除,但是用非顶级域名访问的网站要删除顶级域名的cookie,需要设置获取到的cookie的domain为顶级域名,这样才能删除顶级域名的cookie,否则无法删除,默认的会删除访问的域名下对应的cookie,而不是顶级域名的。
if (hc != null)
{
hc.Domain = "abc.com";/////指定为顶级域名则可以在其他二级域名中删除顶级域名的cookie,否则默认删除的是本域名下的cookie
Response.Write("删除域名Cookie!
");
hc.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(hc);
}
2)删除2级域名自身生成的cookie不需要设置domain,可以直接删除。
下面为完整的测试示例,大家自己可以测试一下,注意后面标注了/////////的代码,这些是关键,也注意修改修改代码中设置的域名,我这里为了方便,直接设置了系统hosts文件将abc.com作为测试。
<script runat="server">
private void SetCookie(string name,string value,string domain)
{
HttpCookie hc = new HttpCookie(name, value);
hc.Domain = domain;////////
hc.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(hc);
}
private void ReadCookie(string name)
{
HttpCookie hc = Request.Cookies[name];
if (hc != null) Response.Write("设置的Cookie为:" + hc.Value+"|"+hc.Domain);
else Response.Write("Cookie值为空!");
}
private void DeleteCookie(string name,string domain)
{
HttpCookie hc = Request.Cookies[name];
if (hc != null)
{
hc.Domain = domain;////////
Response.Write("删除域名Cookie!
");
hc.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(hc);
}
}
protected void Page_Load(object sender, EventArgs e)
{
// SetCookie("abc", "abc.com--" + DateTime.Now.ToString(), "www.abc.com");
ReadCookie("abc");
// DeleteCookie("abc","abc.com");
}
script>