【问题标题】:What is the best practice for updating a cookie that was set on a previous request in ASP.NET?更新在 ASP.NET 中先前请求上设置的 cookie 的最佳做法是什么?
【发布时间】:2011-04-01 18:53:34
【问题描述】:

这里是场景。具有键 "MyCookie" 的 cookie 已在先前的请求中设置。我可以通过HttpContext.Request.Cookies.Get("MyCookie") 访问它。我想执行更新,例如向 Cookie 值集合添加另一个值,但我不能 100% 确定我做对了。

在下面的示例中我是否正确执行此操作?

   public static void UpdateCookie(HttpContext context, string cookieName, Action<HttpCookie> updateCookie){
        var cookie = context.Request.Cookies.Get(cookieName);
        updateCookie(cookie);
        context.Response.Cookies.Set(cookie);
   }

【问题讨论】:

  • 这个问题是否更适合codereview.stackexchange.com?我不确定。
  • @Tuzo,我不这么认为。我的问题只是关于如何正确地做某事。代码 sn-p 不是我的应用程序中的东西。这只是我能想到的最好的方式来解释我目前的理解。如果您查看codereview.stackexchange.com/faq 上的常见问题解答的第一段,您会看到它明确指出代码审查是针对“不是关于...最佳实践”的问题

标签: asp.net httprequest httpresponse httpcookie httpcookiecollection


【解决方案1】:

要更新 cookie,您只需使用新值再次设置 cookie。请注意,您必须包含所有要保留的数据,因为新的 cookie 将替换之前设置的 cookie。我将假设您的 updateCookie() 实现就是这样做的。

否则,您的一般前提是正确的。这是我多次使用的实现。 (注意:_page 是对当前页面的引用):

/// <summary> 
/// Update the cookie, with expiration time a given amount of time from now.
/// </summary>
public void UpdateCookie(List<KeyValuePair<string, string>> cookieItems, TimeSpan? cookieLife)
{
    HttpCookie cookie = _page.Request.Cookies[COOKIE_NAME] ?? new HttpCookie(COOKIE_NAME);

    foreach (KeyValuePair<string, string> cookieItem in cookieItems)
    {
        cookie.Values[cookieItem.Key] = cookieItem.Value;
    }

    if (cookieLife.HasValue)
    {
        cookie.Expires = DateTime.Now.Add(cookieLife.Value);
    } 
    _page.Response.Cookies.Set(cookie);
}

【讨论】:

  • 根据请求 cookie 设置响应 cookie 可能会导致写入一些我们不想要的 cookie 属性,例如 SameSite=None。示例默认 SameSite 值设置为 -1 或 Lax 此值不会由浏览器发送回服务器,并且请求 cookie 具有 SameSite=None,这不是我们再次发送到浏览器时想要的。 (我只是在我的应用程序中修复类似的代码,与最近的 Chrome 更改有关)
猜你喜欢
  • 2020-06-19
  • 2013-01-08
  • 2013-08-06
  • 2011-04-27
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
相关资源
最近更新 更多