cookie为什么清除不掉???

qingYun1029 2011-08-12 09:41:49

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;


namespace CookieTest
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ReadCookie();
}
}

//设置cookie
protected void btnSetCookie_Click(object sender, EventArgs e)
{
Response.Cookies["userName"].Value = "admin";
ReadCookie();
}

//清除cookie
protected void btnClearCookie_Click(object sender, EventArgs e)
{
if (Request.Cookies["userName"] != null)
{
HttpCookie cookie = new HttpCookie("userName");
cookie.Expires = DateTime.Now.AddHours(-1);
Response.Cookies.Add(cookie);
}
ReadCookie();
}

//读取cookie
private void ReadCookie()
{
string userName = "";
if (Request.Cookies["userName"] != null)
{
userName = "userName=" + Server.HtmlEncode(Request.Cookies["userName"].Value);//读取cookie
}
else
{
userName = "cookie不存在";
}
userName = "<script>alert('" + userName + "');</script>";
this.Page.ClientScript.RegisterStartupScript(this.GetType(), "", userName);
}
}
}


代码如上。

当点击设置cookie按钮是,弹出来userName="admin",是正常的;但是当点击第一次“清除cookie”按钮是,弹出来的还是userName="admin",只有当点击第二遍的时候,才弹出来"cookie不存在"。

请问这是怎么回事,好像cookied需要清除两遍才可以成功???
...全文
1093 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
xq870723 2011-08-17
  • 打赏
  • 举报
回复
我之前遇过,我当时的解决方法是:删不掉,就覆盖。
qingYun1029 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 huangwenquan123 的回复:]

引用 27 楼 qingyun1029 的回复:
测试方法,分别点击页面上的两个按钮——“设置cookie”、“清除cookie”,随便点击哪一个,然后将光标定位到地址栏里面敲回车,ie和firefox弹出来的信息却不一致,请问怎么回事???
ie ff测试过了是一样的,先点击设置,在点击清除,在敲回车,地址重新指向该页面。
设置cookie,到清除cookie原理和上面一样,只是只点击一……
[/Quote]

非常感谢!!!
qingYun1029 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 huangwenquan123 的回复:]

lz应该看下从http到Httpmodule开始接收处理,在到httphandler处理,最后在输出到客户端
首先Page是继承自IHttphandler的
当你第一次点击设置cookie的时候,会把cookie附加到请求头里,然后执行ReadCookie(),Request提取Cookie不为null,弹出cookie=admin
当点击清除cookie的时候,Request.提取Coo……
[/Quote]

非常感谢你,谢谢你给这么多真诚的回复。。。

从http到Httpmodule开始接收处理,在到httphandler处理里面的内容实在太多了,找不到这么详细的文档。。。
huangwenquan123 2011-08-14
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 qingyun1029 的回复:]
测试方法,分别点击页面上的两个按钮——“设置cookie”、“清除cookie”,随便点击哪一个,然后将光标定位到地址栏里面敲回车,ie和firefox弹出来的信息却不一致,请问怎么回事???
[/Quote]ie ff测试过了是一样的,先点击设置,在点击清除,在敲回车,地址重新指向该页面。
设置cookie,到清除cookie原理和上面一样,只是只点击一次清除cookie
这是你按了回车,地址重新指向,相当于一个新的请求,因为你上面清除cookie完后输出把cookie的过期时间设置为负一天,此时客户端cookie不存在,当重新请求的时候Request.Cookies["userName"]自然是为null,会弹出不存在。
huangwenquan123 2011-08-14
  • 打赏
  • 举报
回复
lz应该看下从http到Httpmodule开始接收处理,在到httphandler处理,最后在输出到客户端
首先Page是继承自IHttphandler的
当你第一次点击设置cookie的时候,会把cookie附加到请求头里,然后执行ReadCookie(),Request提取Cookie不为null,弹出cookie=admin
当点击清除cookie的时候,Request.提取Cookie不为空,继续执行,执行到Response.Cookies.Add,
此时把Cookie附加到请求头里,你断点看下,此时Request.Cookie会有3个,一个是SessionID,两个username。此时的Response还没有输出到客户端,因为httphandler还没有执行完

protected void btnClearCookie_Click(object sender, EventArgs e)
{
if (Request.Cookies["userName"] != null)
{
HttpCookie cookie = new HttpCookie("userName");
cookie.Expires = DateTime.Now.AddHours(-1);
Response.Cookies.Add(cookie);
}
ReadCookie();
}

然后在到ReadCookie();此时Request提取key为username的Cookie ,不为空弹出username=admin.
最后执行完全部代码,输出到客户端。这时的Cookie因为你设置了过期时间为负一天,客户端的Cookie就不存在了。
当你在点击清除Cookie的时候,Request提取不到Cookie,弹出不存在。
这是为什么要点击两次才显示不存在的原因
而Request.Cookies.Remove("userName");会把请求头里的key为userName的Cookie全部清除,所以只要点击一次就显示Cookie不存在,而Response的Cookie还在,执行完所有程序最终输出到客户端,下一次的请求Request里的username cookie就不存在。
qingYun1029 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 porschev 的回复:]
还没解决?

不是给你提示了吗?

1楼给你的代码中的这一段。。


cookies.Expires = DateTime.Today.AddDays(-1);
Response.Cookies.Add(cookies);
Request.Cookies.Remove(cookiename);
[/Quote]

弄好了。但是还是有点不明白,我的代码是msdn上的,为什么第一次删除没有用呢???

第一次点击删除后,将光标定位到url地址栏里面,敲回车可以做到。。

为什么呢??
porschev 2011-08-12
  • 打赏
  • 举报
回复

还没解决?

不是给你提示了吗?

1楼给你的代码中的这一段。。


cookies.Expires = DateTime.Today.AddDays(-1);
Response.Cookies.Add(cookies);
Request.Cookies.Remove(cookiename);
kidong 2011-08-12
  • 打赏
  • 举报
回复
原来是这样啊 呵呵又学到了
qingYun1029 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 sandy945 的回复:]

看http协议 是想让你了解 cookie 是如何传递的

了解了如何传递的,你才能知道为什么第一次清除失效。

解决办法是

C# code
HttpCookie cookie = new HttpCookie("userName");
cookie.Expires = DateTime.Now.AddHours……
[/Quote]

嗯,好的,谢谢你了。。
阿非 2011-08-12
  • 打赏
  • 举报
回复
看http协议 是想让你了解 cookie 是如何传递的

了解了如何传递的,你才能知道为什么第一次清除失效。

解决办法是

 HttpCookie cookie = new HttpCookie("userName");                
cookie.Expires = DateTime.Now.AddHours(-1);
Response.Cookies.Add(cookie);

=>


 HttpCookie cookie = new HttpCookie("userName");                
cookie.Expires = DateTime.Now.AddHours(-1);
Response.Cookies.Add(cookie);
Request.Cookies.Remove("userName");


new HttpCookie("userName"); 这里new 一个HttpCookie 是没问题的,

关键是要Response.Cookies.Add,不过这不是清除不掉的真正原因。

Request.Cookies.Remove("userName"); 这句是关键代码, 不过这和asp.net 具体实现有关

qingYun1029 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 sandy945 的回复:]

应该先看http协议 这个和asp.net 无关

和顺序有些关系
[/Quote]

看http主要看什么呢??

rfc文档吗???

麻烦推荐一下。。
qingYun1029 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 dongxinxi 的回复:]

C# code
HttpCookie cookies = Request.Cookies[cookiename];
if (cookies != null)
{
cookies.Expires = DateTime.Today.AddDays(-1);
}


1#的代……
[/Quote]

谢谢你的提醒。。。
qingYun1029 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 dongxinxi 的回复:]

C# code
HttpCookie cookies = Request.Cookies[cookiename];
if (cookies != null)
{
cookies.Expires = DateTime.Today.AddDays(-1);
}


1#的代……
[/Quote]

没有无视他的代码,我是动手尝试过的。。。

但是我刚才有尝试了一下,这一次可以,但是第一次确实错误了。。
qydvip 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 porschev 的回复:]
C# code


#region##删除cookies
/// <summary>
/// 删除cookies
/// </summary>
public void DelCookeis()
{
foreach (string cookiename in Request.Cookies.AllKeys)
……
[/Quote]
+1
  • 打赏
  • 举报
回复
HttpCookie cookies = Request.Cookies[cookiename];
if (cookies != null)
{
cookies.Expires = DateTime.Today.AddDays(-1);
}


1#的代码为什么直接被你无视了呢?
应该是把客户端的Cookie取过来,然后更新过期时间,并重新Response出去
而不是在服务端又new一个
阿非 2011-08-12
  • 打赏
  • 举报
回复
应该先看http协议 这个和asp.net 无关

和顺序有些关系
qingYun1029 2011-08-12
  • 打赏
  • 举报
回复
csdn今天打开个人主页,空间……怎么这么慢啊,

我们10M光纤。日!
  • 打赏
  • 举报
回复
[Quote=引用楼主 qingyun1029 的回复:]
C# code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;


namespace CookieTest
{
public part……
[/Quote]

ReadCookie() 方法删掉

直接在设置和清除中 respons.write..

你这样写虽然在if语句里加了判断条件 但是在一个页面连续操作 设置和清除程序还是会走的




qingYun1029 2011-08-12
  • 打赏
  • 举报
回复
有人知道不啊???

是否和执行顺序有关,有人能给个力证没???

分数加一倍。。
qingYun1029 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hexytxl 的回复:]

某些情况下绑定在Page_PreRender和Page_Load效果是不一样的O(∩_∩)O~
[/Quote]

呵呵,很不幸,在这儿是一样的。。。
加载更多回复(13)

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧