重定向期间删除Cookie

5
如果有一个带有特定cookie的请求,我想要删除该cookie,并重定向回同一操作(并保留查询字符串、路由值等)。我期望在第二个(重定向的)请求中,该cookie将被删除。但它并没有被删除。我的操作方法:
[DeleteCookie]
public virtual ActionResult doStuff() {
  // blah
}

我的动作过滤器:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class DeleteCookieAttribute : ActionFilterAttribute {

  public override void OnActionExecuting(ActionExecutingContext context) {

    var request = context.HttpContext.Request;

    if (request.Cookies.AllKeys.Contains("foo")) {
      request.Cookies["foo"].Expires = DateTime.Now.AddYears(-1);     // I tried this
      request.Cookies.Remove("foo");                                  // I tried this
      context.Result = new RedirectToRouteResult(context.RouteData.Values);
    }

  base.OnActionExecuting(_filterContext);
  }

}

在第一次请求时,一旦我删除了cookie,它就从请求中消失了。但是在第二个重定向的请求中,它仍然存在!因此,上面的代码进入了一个无限循环。

我该如何删除它?


2
你尝试过从响应对象中删除cookie而不是请求吗?AddYears(-1)也应该在响应对象上起作用。 - LDJ
4个回答

5

试试这个:

HttpCookie cookie = Request.Cookies["foo"];
if (cookie != null)
{
    cookie .Expires = DateTime.Now.AddYears(-1);
    Response.Cookies.Add(cookie);
}

1
关键是要更新响应。这在我的代码中缺失了。 - h bob

0

我正在添加一些与cookie相关的非常重要的要点

  1. 我们始终可以添加cookie(临时和永久)。
  2. 我们无法删除cookie,因为它将存储在客户端机器上,我们没有权限执行删除操作。

请参考以下解决方案。

if (Request.Cookies["userId"] != null)

{

Response.Cookies["userId"].Expires = DateTime.Now.AddDays(-1);

}

请检查cookie是否存在,不要使用Remove关键字,它不起作用。


0

分享一种最好的方法,它将帮助您更好地理解。您也可以使用天数来完成。

这并不是非常强制性的,您只需要添加年份即可。

HttpCookie cookie = Request.Cookies["testcookie"];

if (cookie != null)

{

cookie.Expires = DateTime.Now.AddDays(-1);

Response.Cookies.Add(cookie);

}


0

我无法通过MVC来使cookie过期并重定向页面。

正如这个答案所解释的那样:https://dev59.com/DHvaa4cB1Zd3GeqPAj3p#21134768

我必须使cookie过期,然后显示一个视图,在该视图中进行重定向。(在我的情况下,我使用RedirectToAction将其重定向回相同的控制器操作。)

@{
    ViewBag.Title = "Expire";
    Layout = null;
    Response.Redirect( Url.Action("Index", "Home"), false);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接