日期:2014-05-16  浏览次数:20432 次

新手对Cookie使用的疑问
本帖最后由 huge92 于 2014-03-26 23:53:34 编辑
情形1:

         HttpCookie c = Request.Cookies["User_Time"];

         if (c == null)
         {
             string Time = DateTime.Now.ToString();
             HttpCookie hc = new HttpCookie("User_Time", Time);

             Response.AppendCookie(hc);
             Response.Redirect(Request.Url.ToString());
         }
         else
         {
             Response.Write("现在的时间:" + DateTime.Now.ToString() + "<br/>");
             Response.Write("上次登录的时间:" + c.Value + "<br/>");

             //更新cookie
             c.Value = DateTime.Now.ToString();
             Response.Cookies.Set(c); 

             Response.Write("RequestCookie:" + Request.Cookies["User_Time"].Value);
          }


结果:
正常情况:


情形2:
把Response.Cookies.Set(c); 拿掉:

             Response.Write("现在的时间:" + DateTime.Now.ToString() + "<br/>");
             Response.Write("上次登录的时间:" + c.Value + "<br/>");

             //更新cookie
             c.Value = DateTime.Now.ToString();

             Response.Write("RequestCookie:" + Request.Cookies["User_Time"].Value);


结果:


正如你所看到的,这时候无论怎么刷新网页,上次登录时间都停留在那一点。

而Request.Cookies["User_Time"].Value却随时更新。
它之所以能显示当前时间是因为:
HttpCookie c = Request.Cookies["User_Time"];
c是个引用类型,而右边也是,c.Value = DateTime.Now.ToString();
右边的引用拷贝给了c,所以二者相同的引用,左边的值改了,右边也会相应地改。

那么既然已经更新了Request.Cookies["User_Time"].Value为什么反而上次登陆时间会停留不动呢?
程序开头有HttpCookie c = Request.Cookies["User_Time"];呀?

看网上说,Cookies一开始在服务端,当用户第一次登陆的时候,客户端把它传到用户的机器上,那后面应该在用户的机器上直接修改就可以了吧,为什么还用Response.Cookies.Set(c),而不用Request.Cookies.Set(c)?
------解决方案--------------------
cookie是保存在客户端的字符串,Request是请求,Response是响应。
------解决方案--------------------
靠 差点被你骗了 cookies保存在客户端机器上
 Response.Cookies.Set(c);  会将当前时间设置到cookies里面
去掉&