none
HttpCookie在Firefox中运行很结果。 RRS feed

  • 问题

  • 简单的代码:

    C# code

    protected void btnLogin_Click(object sender, EventArgs e)
            {
                HttpCookie userNameCookie = new HttpCookie("username","wyp");
                userNameCookie.Path = "/";
                userNameCookie.Secure = false;

                HttpCookie passWordCookie = new HttpCookie("password","wyp");
                passWordCookie.Path = "/";
                passWordCookie.Secure = false;

                Response.Cookies.Add(userNameCookie);
                Response.Cookies.Add(passWordCookie);

                Response.Redirect("http://127.0.0.1/index.aspx");
            }



     

    这段程序在firefox中正在运行后。页面转到index.aspx页面。
    此时,关闭firefox,注意不是关闭firefox的选项卡。
    接着,再打开firefox,直接输入 http://127.0.0.1/index.aspx

    发现我可以正常访问这个index.aspx,可在ie中,如果我进行上述的操作,肯定是转到登录页了。

    我的cookie并未设置过期时间,按理,应该是关闭浏览器cookie即过期,可是为什么在firefox中不过期呢。谢谢。

    2009年3月19日 9:56

答案

  • 默认情况下,cookie是浏览器进程的,只要浏览器进程关闭了,则cookie也就不存在了
    ie浏览器都是多进程的,ff是单进程的,
    孟宪会
    2009年3月19日 13:14
    版主
  • 请确认firefox真是的全部关闭了,比如,你点文件下载的时候,ff会弹出一个下载管理器,如果网页都关闭了,而这个下载管理器没有关闭,则仍有firefox进程存在的,
    比较简单的办法是打开任务管理器进行查看。

    默认情况下是不保存的


    孟宪会
    2009年3月19日 14:01
    版主

全部回复

  • Cookies 默认有效时间为30分钟,至于会不会清除,要根据你的Firefox或者IE的设置来定,
    Firefox,可以设置为关闭后清除, IE也一样。
    你的情况可能是FireFox的Cookies保留了,没有被清除,而IE清除了,注意他们的Cookies是不能通用的。

    jon.valett@gmail.com
    2009年3月19日 10:07
    版主
  • 感谢您的回复.
    我认真的查了下msdn,并没有找到您所说的cookie的默认过期时间是30分钟.

    引用msdn:

    如果没有设置 Cookie 的有效期,仍会创建 Cookie,但不会将其存储在用户的硬盘上。而会将 Cookie 作为用户会话信息的一部分进行维护。当用户关闭浏览器时,Cookie 便会被丢弃。

    但msdn的说法,似乎在firefox中无法得到应证啊.
    2009年3月19日 12:12
  • Response.Cookies.Add(userNameCookie);
    Response.Cookies.Add(passWordCookie);

    你好,你上面设置就已经在硬盘上创建了永久性的Cookie,至于默认保存时间,我记得好象是在书上介绍的,
    我明天参考一下MSDN的信息。

    jon.valett@gmail.com
    2009年3月19日 12:19
    版主
  • 不完全关闭fireofx仍然保持 Cookie,是 Firefox自己的做法。其实,firefox如果不关闭下载管理器,也是可以保留cookie的
    不同的浏览器实现方法有所不同。没有一个标准的规定

    Cookie默认是浏览器进程的,没有默认过期时间,
    30分钟是forms验证中的cookie默认过期时间

    http://msdn.microsoft.com/zh-cn/library/1d3t3c61.aspx
    孟宪会
    2009年3月19日 12:42
    版主
  • TO:
    邹俊才

    感谢您的回复.

    我上面的代码是肯定不会创建持久性的cookie的.
    2009年3月19日 12:59
  • 默认情况下,cookie是浏览器进程的,只要浏览器进程关闭了,则cookie也就不存在了
    ie浏览器都是多进程的,ff是单进程的,
    孟宪会
    2009年3月19日 13:14
    版主
  • 感谢孟兄不厌其烦的帮我解答.

    如果说ff是单进程的,那么更能说明,ff应用程序关闭后,ff的进程也应该全部关闭才是.(假设进程却没有关闭掉,那肯定是有bug了,题外话.)
    既然进程全都关闭了,那cookie就更没有理由不存了是吧..

    那么现在,我这个没有设置过期时间的cookie,却一直显示在firefox cookies窗体中.

    过期时间 居然大言不惭的写着 当会话结束时

    我就不理解,这个 当会话结束时 ,这个会话的周期到底是多久呢.

    如果我不手动清除的话,那么这个cookie应该是一直存在的?

    这完全我和的本意相抵触了,我本想就是关闭了浏览器,cookie就应该完了..结果..

    我在想是不是应该设置一下cookie的过期时间为30分钟.
    因为这个cookie不是一个可调时间...
    是不是应该在global.asax中的BeginRequest事件中,每次重新将cookie的时间加30分钟.??

    谢谢您的烦心指点.
    2009年3月19日 13:31
  • 请确认firefox真是的全部关闭了,比如,你点文件下载的时候,ff会弹出一个下载管理器,如果网页都关闭了,而这个下载管理器没有关闭,则仍有firefox进程存在的,
    比较简单的办法是打开任务管理器进行查看。

    默认情况下是不保存的


    孟宪会
    2009年3月19日 14:01
    版主
  • 你好,其实在您的计算机上已经以文件的形式存在了,至于是临时的,还是永久的,只是过期时间不同。
    jon.valett@gmail.com
    2009年3月19日 14:11
    版主
  • ie7和Firefox下测试完全是正常的,没有出现在ff下保留cookie的现象。测试代码如下:

    index.aspx

    <%@ Page Language="C#" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <script runat="server">

      protected void Page_Load(object sender, EventArgs e)
      {
        if (Request.Cookies["username"] == null)
        {
          Response.Redirect("Default4.aspx");
        }
      }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
      <title></title>
    </head>
    <body>
      <form id="form1" runat="server">
      <div>
        Cookie存在
      </div>
      </form>
    </body>
    </html>


    Default4.aspx(登录页面)

    <%@ Page Language="C#" %>

    <script runat="server">
      protected void Button1_Click(object sender, EventArgs e)
      {
        HttpCookie userNameCookie = new HttpCookie("username", "wyp");
        userNameCookie.Path = "/";
        userNameCookie.Secure = false;
        Response.Cookies.Add(userNameCookie);

        Response.Redirect("index.aspx");
      }
    </script>

    <form id="form1" runat="server">
    <asp:button id="Button1" runat="server" onclick="Button1_Click" text="Cookie失效,请点击加入Cookie" />
    </form>


    需要注意的是:这里讨论的是Cookie。而不是表单验证。请完全拷贝代码测试。

    另外。你的转向是 http://127.0.0.1/,请保证每次浏览的是使用这个127.0.0.1浏览的


    孟宪会
    2009年3月19日 14:12
    版主
  • 据我所知,Firefox能够让你打开,那就一定是上一个Firefox进程已经完全关闭了。理论上,Firefox是不允许一个Profile同时开启两个进程的,而一般人并不会去改Profile设置,永远只用一个Profile,所以不可能打开两个Firefox进程。如果前一个Firefox窗口关闭了,但进程还没结束,这时候你是打不开新的Firefox进程的。

    唯一解释就是,你设置了Firefox关闭时保存选项卡,下一次打开时只要缓存策略允许Firefox就显示缓存页面,所以仍为登录状态。如果你不希望发生这种情况,你需要设置页面缓存策略,禁止客户端缓存你的页面。
    2009年3月19日 14:54
    版主
  •  

    经过孟兄烦心的解答,终于总到原因。

    如果把浏览器理解成一个类,打开一个浏览器称为一个实例的话。

    如果打开多个IE浏览器,那么会有多个IE实例。
    在多个IE进程中,无法共享数据,具体到这里是无法共享SessionID.

    如果打开多个Firefox,在windows 任务管理器中,仅会有一个firefox的进程。
    而在一个进程中是可以共享数据的。

    其实孟兄说得很对。引用“一定要完全关闭firefox”。

    那么我的问题就发生在:

    我打开一个firefox后,接着登录。此时这个firefox并未关闭。
    然后,我接着再打开一个firefox,再关闭第一个firefox。

    在第一个firefox未关闭的时候,第二个firefox又打开了,接着关闭第一个的过程中,在firefox的一个进程中可以共享数据,
    所以,第二个firefox接收到第一个firefox的SessionID。

    这就是问题的原因。

    十分感谢孟兄帮我解惑。谢谢。

    2009年3月19日 14:57