【问题标题】:ASP.NET Cookie Expires value resets on Response.Redirect?ASP.NET Cookie Expires 值在 Response.Redirect 上重置?
【发布时间】:2009-01-15 14:40:48
【问题描述】:

我有一个脚本可以读取表单并将一些信息放入 cookie:

Dim oCookie as HttpCookie
oCookie = New HttpCookie("authInfo")
Select Case oResult
Case "No ClientID", "No Password", "No PracType", "No Encrypt", "CRC Mismatch"
    oCookie.Values.Add("LoggedIn", "False")
    oCookie.Values.Add("OnSupport", "False")
Case "Client Can Update"
    oCookie.Values.Add("LoggedIn", "True")
    oCookie.Values.Add("OnSupport", "True")
Case "Client Cannot Update"
    oCookie.Values.Add("LoggedIn", "True")
    oCookie.Values.Add("OnSupport", "False")
End Select
oCookie.Expires = DateTime.Now.AddHours(2)
HttpContext.Current.Response.Cookies.Add(oCookie)
HttpContext.Current.Response.Redirect("default.aspx")

在重定向之前正确设置了时间,但是当我尝试以这种方式打印出该值时(我也尝试过Dim oCol as HttpCookieCollection = Request.Cookies,但我得到了相同的结果):

Response.Output.WriteLine(Request.Cookies("authInfo").Expires.ToString)

时间总是重置"01/01/0001 12:00:00 AM"。我是否遗漏了阻止 cookie 保持其 Expires 值的内容?

【问题讨论】:

    标签: asp.net vb.net cookies


    【解决方案1】:

    Request.Cookies 和 Response.Cookies 以及通用 cookie 对象的使用构成了一个直观的习惯用法,但实际上 Request cookie 和 Response cookie 完全不同。

    当您在响应中分配 Cookie 时,Set-Cookie 标头会添加到输出中,其中不仅包含值,还包含路径和到期值。

    但是,当浏览器在另一个请求中将 cookie 发送回服务器时,它只包含 cookie 名称和值。它不发送路径或过期信息。

    因此,这些属性在使用 Request.Cookies 集合时毫无意义。

    【讨论】:

    • 那么,如果可能的话,我如何保留 Expires 值?
    • @Anders:你在改变 cookie 的值吗?如果是这样,为什么它不会获得新的过期值?如果不是你为什么要重新设置它,你只需要创建一次 cookie。
    • 不,检查上面的代码。我正在创建一个新的 cookie,设置 3 个值(包括 Expires;否则为 2 个)。
    • @Anders:浏览器将保留它,并在 cookie 过期后终止它。您是否需要在后续请求中读取 expires 值?如果是这样,您需要将其存储在其他一些持久性存储服务器端。
    • @Chris:我没有在 cookie 中存储查询,你在哪里看到的?
    【解决方案2】:

    我知道这是一个老话题,@Anders 可能已经从这里开始做更大更好的事情了。尽管如此,我在尝试在我当前的 HttpContext 中保留 Office 365 身份验证 cookie 时遇到了同样的问题后碰巧偶然发现了这一点。可以说,@AnthonyWJones 的回答澄清了我对 cookie 的很多直觉。这适用于像我这样必须遇到此线程的人,尽管交换了信息,但仍无法找到维持 cookie 到期日期的回旋处。 这是我最终尝试的: 1. 在将 cookie(其到期日期是必需的)添加到 HttpResponse 之前,我将其到期日期和域保存在我的数据库中。 2. 然后可以将 cookie 添加到 Response 中,其基本属性不变,例如“Name”和“Value”。 3. 从请求中检索到 cookie 后,我构造了一个新的 cookie,其中包含从 DB 获得的域和到期日期以及其余属性。 然后我就可以使用这些 cookie 向目标站点发起更多请求。

    【讨论】:

      【解决方案3】:

      当初始请求来自不同的域时,我遇到了这样的问题。
      确保您还添加了 cookie 的域。

      【讨论】:

      • 我试过了;徒劳无功。我现在在 localhost 上进行测试,是否需要将端口作为域的一部分包含在内(即 localhost:12345 而不仅仅是 localhost)?
      【解决方案4】:

      如果您想检查过期日期,可以将其添加到 cookie 值集合中。然后检索它并进行检查。

      【讨论】:

        猜你喜欢
        • 2012-08-06
        • 2012-03-31
        • 2018-05-31
        • 1970-01-01
        • 1970-01-01
        • 2019-09-19
        • 1970-01-01
        • 1970-01-01
        • 2012-12-20
        相关资源
        最近更新 更多