Cookies 总是读取上次 的值???超郁闷

booxi999 2009-04-04 03:16:05
Cookies 总是读取上次 的值???超郁闷


如题,在同一个页面里先存储cookies值,
然后再读取该cookies值,此时,读出来的cookies值,不是刚才写入的cookies值,
而是在之前写入的cookies值。
实在不解,又郁闷,烦了很久了。

先贴代码,

前台代码:

<asp:Label ID="Label1" runat="server" ></asp:Label>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Text="Button"

OnClick="Button1_Click" />


后台代码:

protected void Page_Load(object sender, EventArgs e)
{
this.Response.Expires = -1;
}

protected void Button1_Click(object sender, EventArgs e)
{
string strCookiesName = "ri";

this.ClearCookie(strCookiesName);
this.SaveCookie(strCookiesName, TextBox1.Text, 60);

Label1.Text = this.GetCookie(strCookiesName, "");

}


/// <summary>
/// 保存Cookie
/// </summary>
public void SaveCookie(string cookieName, string cookieValue, int

cookieExpiryMinute)
{
HttpCookie cookie = new HttpCookie(cookieName, cookieValue);
cookie.Expires = DateTime.Now.AddMinutes(cookieExpiryMinute); //

设置Cookie过期时间
cookie.Path = "/";

//删除旧的同名Cookie
Response.Cookies.Remove(cookieName);
Response.Cookies.Add(cookie);
}

/// <summary>
/// 清除Cookie
/// </summary>
public void ClearCookie(string cookieName)
{
this.SaveCookie(cookieName, "", -5);
}

/// <summary>
/// 取Cookie
/// </summary>
public string GetCookie(string cookieName, string defaultValue)
{
string strResult = defaultValue;
try
{
if (Request.Cookies != null)
{
if (Request.Cookies[cookieName] != null)
{
HttpCookie cookie = Request.Cookies[cookieName];
strResult = cookie.Value;
}
}
}
catch (Exception ex)
{
}

return strResult;
}

可以把代码贴到网页里运行一下,就知道情况了。

一开始运行的时候,Label1输出空值,
当在TextBox1里输入1,点击按钮这里回传回执行代码,再输出1

然后在TextBox1里输入2,点击按钮这里回传回执行代码,再输出1
这时候就怪了,这里应该输出cookies的新值2才对呀,怎么还输出上次的值1呢?

继续在TextBox1里输入3,点击按钮这里回传回执行代码,这里输出了上次存的2

继续在TextBox1里输入4,点击按钮这里回传回执行代码,这里输出了上次存的3



在Button1_Click事件里,
如果把
this.SaveCookie(strCookiesName, TextBox1.Text, 60);

Label1.Text = this.GetCookie(strCookiesName, "");
这两句互换下,也就是先读cookies值,再写新值,
然后运行,其结果跟以前一模一样。


如果把
this.ClearCookie(strCookiesName);
这句也就是清除cookies入在Button1_Click事件的最后,
然后运行,这样会得到正确的值,也就是TextBox1里输入什么值,
Label1能正确的输入当前的值。
但是最后this.ClearCookie(strCookiesName);
清除了cookies也不是想要的事情了。


实在是不解,不知怎么办啊。
...全文
646 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
west2008 2010-07-16
  • 打赏
  • 举报
回复
你可以在js中改cookie值 ,然后再通过服务器端获取。
js
document.cookie="id=1";
this.forms[1].submit();
document.cookie="id=2";
不要通过Response.cookies["id"]="2";
这个是没用的,用我上面写的是可以的。
booxi999 2009-04-04
  • 打赏
  • 举报
回复

好像有点明白了,
试了很多次,能够每次执行都得到了TextBox里的值有三个方法。

一:在机器里还没有存储该Cookie前,第一次运行该页面,
可以得到TextBox里的值。在第二次以后运行都不行了。

二:我在Button1_Click事件里
定义Cookie名字的时候用了这下面这句
string strCookiesName = new Random().Next(1, 100000).ToString();
也就是随机定义Cookie,原理应该和上面第一点一样。


三:在Button1_Click事件的最后
加入
this.ClearCookie(strCookiesName);
也就是清除cookies。


仔细想了想为什么这样会能够得到。

应该是这样的。在每次打开页面时,http会把机器里的所有关该网站的cookie
发送到服务器端。

在执行方法SaveCookie()时,暂时在服务器端的内存给个位置存储。

接着执行GetCookie(),

在第一次打开页面时,由于在此前电脑机器里没有存储该Cookie,
也就是服务器端没有接收到以前的Cookie
所以这次,执行GetCookie(),
能顺利的读取到刚才SaveCookie()暂时存在服务器端内存里的值。
(注:Cookie名叫"ri",此时服务器Cookies集合中名字叫"ri"的只有刚才这一个)

紧接着页面完成执行,内容输出到客户端,刚才的Cookie值被写入客户端。


然后在新页面里的TextBox里输入新值,回发给服务器。
同时把电脑里的cookie也一并发送到服务器端。

这时,服务器Cookies集合中收到这个名字叫"ri"的一个。

接着再执行方法SaveCookie()时,
在服务器Cookies集合中新加一个名字也叫"ri"的一个。
这时就会有两个"ri"Cookie,
先前从客户端收到的Cookie的Index为0,
刚新加的这个Index为1。
(
注:在SaveCookie()方法,新加Cookie时,会删除之前的同名Cookie
但是为什么没删除先前从客户端收到的Cookie呢?
试了很多,删除方法,只删除服务器端新加的Cookie,
如果从客户端收到的Cookie,则要回发给客户端才能删除。
)

接着执行GetCookie(),很自然的就找到了"ri",Index为最先的那个(0)
也就是从客户端上次接收来的那个了。

所以回顾一下前面那三种情况能正常得到值的原因就是这样了。
人生就是赌 2009-04-04
  • 打赏
  • 举报
回复
实在不知道啊
我提供读写cookies的方法吧,这个是我测试成功的

写入cookies

/// <summary>
/// 辅助设置Cookies值
/// </summary>
/// <param name="keyName">键名称</param>
/// <param name="value">键值</param>
/// <param name="encode">是否需要过滤</param>
private static void HelpForSetCookiesValue(string keyName, string value)
{
HttpContext.Current.Response.Cookies[keyName].Value = HttpUtility.UrlEncode(value);
HttpContext.Current.Response.Cookies[keyName].Path = "/";
}


读cookies

/// <summary>
/// 获取Cookies的值,返回string类型,没有值将返回空字符串(string.Empty)
/// </summary>
/// <param name="keyName">要获取的cookie的键名称</param>
/// <returns>返回字符串</returns>
public static string GetCookieValue(string keyName)
{
string value = string.Empty;
HttpCookie httpCookie = HttpContext.Current.Request.Cookies[keyName];
if (httpCookie != null && !string.IsNullOrEmpty(httpCookie.Value))
{
value = HttpUtility.UrlDecode(httpCookie.Value.Trim());
}
return value;
}


删除cookies

/// <summary>
/// 用户退出删除cookies,多个Cookie中间用“,”隔开
/// </summary>
/// <param name="allCookies">Cookie名称,多个Cookie中间用“,”隔开</param>
public static void DelCookies(string allCookies)
{
string[] everyCookie = allCookies.Split(',');
foreach (string a in everyCookie)
{
HttpCookie myCookie = null;
if (HttpContext.Current.Request.Cookies[a] != null)
{
myCookie = HttpContext.Current.Request.Cookies[a];
}
else
{
myCookie = new HttpCookie(a);
}
myCookie.Values.Clear();
myCookie.Expires = DateTime.Now.AddYears(-1);
}
}
sayoath 2009-04-04
  • 打赏
  • 举报
回复
httpcookie 定义一个COOK

里边有很多方面 你试下。。

是不是XML文件动什么东西了。。
zzxap 2009-04-04
  • 打赏
  • 举报
回复
Response.Cookies["xxx"].Value = null;

然后重新赋值
booxi999 2009-04-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 elevenbus 的回复:]
这种情况应该用session解决
同一页面从上到下执行,没有跳转或回发
cookies都还没有到本地,当然只能读到原来的值
[/Quote]

明白,

但还有个问题,
我把
 this.ClearCookie(strCookiesName);
这句也就是清除cookies 
放在Button1_Click事件的最后,

然后运行,这样会得到正确的值,也就是TextBox1里输入什么值,
Label1能在当前页得到正确的输入值
也很怪。
  • 打赏
  • 举报
回复
退出的时候 注销 cookies
人生就是赌 2009-04-04
  • 打赏
  • 举报
回复
这种情况应该用session解决
同一页面从上到下执行,没有跳转或回发
cookies都还没有到本地,当然只能读到原来的值
booxi999 2009-04-04
  • 打赏
  • 举报
回复
楼上这位兄台,
执行后,效果还是一样的。
wuyq11 2009-04-04
  • 打赏
  • 举报
回复
public void DeleteCookies(HttpResponse response, HttpRequest request, HttpServerUtility server, string IndexValue)
{
if (request.Cookies[IndexValue] != null)
{
HttpCookie cookies=request .Cookies[IndexValue];
cookies .Expires=System.DateTime.Now.AddHours(-1);
response.Cookies.Add(cookies);
}
}
public void SetCookie(string cookieName, string cookieValue, int cookieExpiryMinute)
{
cookieName = cookieName.ToLower();
HttpCookie cookie = new HttpCookie(cookieName,cookieValue);
cookie.Expires = DateTime.Now.AddMinutes(cookieExpiryMinute);
cookie.Path = "/";
//删除旧的同名Cookie
HttpContext.Current.Response.Cookies.Remove(cookieName);
HttpContext.Current.Response.Cookies.Add(cookie);
}
booxi999 2009-04-04
  • 打赏
  • 举报
回复
我想解决了这个Cookies的问题才说,不然以后都回避,都没法用Cookies了

后来几次断点,查看,
发现在SaveCookies方法里的

//删除旧的同名Cookie
Response.Cookies.Remove(cookieName);

在执行这句前,Cookies里存了两个一样的同名Cookie
在执行了Response.Cookies.Remove(cookieName);这句后,把旧的那个删除了,
但还是留了一个,所以我又在后面多加了句:

if (Request.Cookies[cookieName] != null)
{
Response.Cookies.Remove(cookieName);
}
执行了这句后,没有任何变化,还是有一个Cookie。
sayluyun 2009-04-04
  • 打赏
  • 举报
回复
数据量不大的是没有什么影响的·· 还有几种传值方法可以选择 Application ,Server.Transfer
booxi999 2009-04-04
  • 打赏
  • 举报
回复
换成Session,可以解决这个问题,
但是以后我用在多用户系统里,每个用户就会分配个Session,那也不是我想要的。
sayluyun 2009-04-04
  • 打赏
  • 举报
回复
把COOKies换session试试··

62,267

社区成员

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

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

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

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