none
怎么设置cookie存活时间 RRS feed

  • 问题

  • <sessionState mode="InProc" cookieless="false" >
    这里表示使用cookie来存放会话sessionID,  设置cookie存活时间时,cookie才是持久性cookie
    那么这里的cookie存活时间怎么设置???

    它跟下边的有什么关系

    Response.Cookies["UserName"].Value = "cxx";  //设置cookie
    Response.Cookies["UserName"].Expires = DateTime.Now.AddDays(1);  //设置过期时间



    2009年3月14日 9:43

答案

  • sessionState使用ASP.NET_SessionId这个系统定义的cookie来辨别session是属于哪个客户端的,这个系统设置的ASP.NET_SessionId这个cookie与forms认证里面使用的cookie没有关系。session的过期根据客户端最后一次访问整站页面的时刻之后,到timeout设定的时间过了之后到期,也就是说,每次访问都会向后延长一个你timeout设定的时间。

    forms 验证设置的cookie有绝对到期时间和可调过期2种方法。也可以设置可调过期,也就是设置

    slidingExpiration=true

    forms 验证和Session验证是2种验证方法。


    孟宪会
    • 已标记为答案 cxxaspnet 2009年3月16日 7:23
    2009年3月16日 5:26
    版主
  • 为了说明问题,你可以做下面一个实验,以增加感性认识,
    在你的web.config里设置
    <sessionState mode="InProc" timeout="3"></sessionState>
    <authentication mode="Forms">
        <forms name="admin" loginUrl="Login.aspx" protection="All" timeout="1" slidingExpiration="false">
            <credentials passwordFormat="Clear">
                <user name="mxh" password="111"/>
            </credentials>
        </forms>
    </authentication>
    <authorization>
        <allow users="mxh"/>
        <deny users="*"/>
    </authorization>

    Login.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 Button1_Click(object sender, EventArgs e)
        {
            if (TextBox1.Text == "mxh" && TextBox2.Text == "111")
            {
                FormsAuthentication.SetAuthCookie(TextBox1.Text,true);
     
                
             
                Response.Redirect(Request.QueryString["ReturnUrl"]);
            }
        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
       
            <asp:TextBox ID="TextBox1" runat="server" Text="mxh"></asp:TextBox>
            <asp:TextBox ID="TextBox2" runat="server" Text="111"></asp:TextBox>
       
        </div>
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
        </form>
    </body>
    </html>


    然后再写一个Session的验证的页面

    protected void Page_Load(object sender, EventArgs e)
    {
      if (Session["a"] == null)
      {
        Session["a"] = System.DateTime.Now.ToString();
      }

      Response.Write( Session["a"].ToString());
    }


    这样,如果你不停地刷新页面,则forms验证会在一分钟后过期,然后让你重新登陆,而session的值仍然不变。
    如果你在3分钟内没有刷新页面,则forms验证和session验证都会过期,你需要重新登陆,并且session也变成了新的值。

    孟宪会
    • 已标记为答案 cxxaspnet 2009年3月16日 7:23
    2009年3月16日 5:43
    版主

全部回复

  •  Expires过期时间就是Cookie保留的时间。Response.Cookies["UserName"].Expires = DateTime.Now.AddDays(1); 只是UserName这个Cookie的时候,与其他的 Cookie没有关系。

    <sessionState mode="InProc" cookieless="false" >里面可以通过
    <sessionState mode="InProc" cookieless="false" timeout="90"  >  timeout单位:分钟进行设置
    孟宪会
    2009年3月14日 12:44
    版主
  • Session的Cookie是又ASP.NET系统自己控制的,你不需要也无法设置。如果你想知道它的过期时间,监听一下HTTP协议看看expires就知道了。
    2009年3月14日 14:05
    版主
  • cookie对象的Expires属性用来设置当前cookie的存活时间。

    比如你将一个cookie的Expires属性值设置为一天,那么这个cookie就存活一天。
    2009年3月15日 9:29
  • 问题一:
    Session的Cookie是由ASP.NET系统自己控制的,那么这里的Cookie只是存储了SessnID,并没有存储服务端的Session的信息,SessionID和服务端的Session信息的过期时间都是通过
    <sessionState mode="InProc" cookieless="false" timeout="90"  >这句设置的吗?

    问题二:
    Response.Cookies["UserName"].Value = "cxx";
    Response.Cookies["UserName"].Expires = DateTime.Now.AddDays(1);  //这里的过期时间只是"UserName"这个cookie的过期时间,跟上边那个由ASP.NET系统自己控制的cookie无关,我这样说对吗?



    2009年3月16日 1:45
  • 对的。服务器端无法知道是哪个用户发起的请求的,Session是通过SessionID来标识哪个用户的,Session的具体内容是存储在服务器端的。
    孟宪会
    2009年3月16日 2:06
    版主
  • 假如我设置<sessionState mode="InProc" cookieless="false" timeout="90" >
    这里使用了cookie,那么这里的cookie存的SessionID和下边的cookie有什么关系或者说有什么不同?

      <authentication mode="Forms">
        <forms name="cookie1" loginUrl="login.aspx" protection="All">
        </forms>
      </authentication>
    2009年3月16日 4:03
  • sessionState使用ASP.NET_SessionId这个系统定义的cookie来辨别session是属于哪个客户端的,这个系统设置的ASP.NET_SessionId这个cookie与forms认证里面使用的cookie没有关系。session的过期根据客户端最后一次访问整站页面的时刻之后,到timeout设定的时间过了之后到期,也就是说,每次访问都会向后延长一个你timeout设定的时间。

    forms 验证设置的cookie有绝对到期时间和可调过期2种方法。也可以设置可调过期,也就是设置

    slidingExpiration=true

    forms 验证和Session验证是2种验证方法。


    孟宪会
    • 已标记为答案 cxxaspnet 2009年3月16日 7:23
    2009年3月16日 5:26
    版主
  • 为了说明问题,你可以做下面一个实验,以增加感性认识,
    在你的web.config里设置
    <sessionState mode="InProc" timeout="3"></sessionState>
    <authentication mode="Forms">
        <forms name="admin" loginUrl="Login.aspx" protection="All" timeout="1" slidingExpiration="false">
            <credentials passwordFormat="Clear">
                <user name="mxh" password="111"/>
            </credentials>
        </forms>
    </authentication>
    <authorization>
        <allow users="mxh"/>
        <deny users="*"/>
    </authorization>

    Login.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 Button1_Click(object sender, EventArgs e)
        {
            if (TextBox1.Text == "mxh" && TextBox2.Text == "111")
            {
                FormsAuthentication.SetAuthCookie(TextBox1.Text,true);
     
                
             
                Response.Redirect(Request.QueryString["ReturnUrl"]);
            }
        }
    </script>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
       
            <asp:TextBox ID="TextBox1" runat="server" Text="mxh"></asp:TextBox>
            <asp:TextBox ID="TextBox2" runat="server" Text="111"></asp:TextBox>
       
        </div>
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
        </form>
    </body>
    </html>


    然后再写一个Session的验证的页面

    protected void Page_Load(object sender, EventArgs e)
    {
      if (Session["a"] == null)
      {
        Session["a"] = System.DateTime.Now.ToString();
      }

      Response.Write( Session["a"].ToString());
    }


    这样,如果你不停地刷新页面,则forms验证会在一分钟后过期,然后让你重新登陆,而session的值仍然不变。
    如果你在3分钟内没有刷新页面,则forms验证和session验证都会过期,你需要重新登陆,并且session也变成了新的值。

    孟宪会
    • 已标记为答案 cxxaspnet 2009年3月16日 7:23
    2009年3月16日 5:43
    版主
  • 孟老师,你的意思是不是这样:
    sessionState使用ASP.NET_SessionId这个系统定义的cookie来辨别session是属于哪个客户端的

      <authentication mode="Forms">
        <forms name="cookie1" loginUrl="login.aspx" protection="All">
        </forms>
      </authentication>
    而这里的cookie用来辨别是属于哪个登陆用户的


    假如我这样设置
    <sessionState mode="InProc" timeout="1"></sessionState>
    <authentication mode="Forms">
        <forms name="admin" loginUrl="Login.aspx" protection="All" timeout="3" slidingExpiration="false">
    假如我有1.5分钟不刷新页面,这时候存放SessionId的cookie过时被删除,而存放用户名的cookie还在,那么我在2分钟的时候刷新页面会出现什么情况
    2009年3月16日 6:56
  • Cat Chen
    监听
    HTTP协议应该监听不到expires,因为客户端根本就没有传expires给服务端
    2009年3月16日 7:18