ASP.Net MVC 5 Cookie从浏览器返回时失效

时间:2017-05-18 20:59:44

标签: c# asp.net asp.net-mvc cookies asp.net-mvc-5

这个简单的代码让我感到困惑。

从这个控制器动作方法,我创建一个cookie,给它一个过期并将其设置为HttpOnly。 cookie被正确创建,添加到Response,在浏览器调试器上看起来正确,但是在刷新后返回到相同的代码时,会丢失到期和HttpOnly标志。 cookie本身仍然存在,但值丢失了。如果我在浏览器之后看到Request.Cookies [" mycookie"]回到相同的控制器/操作方法中,则值将消失 - 但cookie本身不会被删除。

如果有人理解这种行为,请解释一下,这里可能会发生什么 -

public class HomeController : Controller
    {
        public ActionResult Index()
        {

           if (this.ControllerContext.HttpContext.Request.Cookies["mycookie"] == null)
            {
                HttpCookie cookie = Response.Cookies["mycookie"];
                cookie["mycookie"] = "test";
                cookie.Expires = DateTime.Now.AddDays(90);
                cookie.HttpOnly = true;   
               this.ControllerContext.HttpContext.Response.SetCookie(cookie);
            }

            return View();
        }

2 个答案:

答案 0 :(得分:0)

请参阅下面的代码。

var request=this.ControllerContext.HttpContext.Request;
var response =this.ControllerContext.HttpContext.Response;
//OR
// var request=System.Web.HttpContext.Current.Request;
//var response =System.Web.HttpContext.Current.Response;
if (request.Cookies["mycookie"] == null)
 {
    HttpCookie cookie= new HttpCookie("mycookie");
    cookie.Value = "test";//your problem hear.
    cookie.Expires = DateTime.Now.AddDays(90);
    cookie.HttpOnly = true;      
    response.Cookies.Add(cookie);        
  }
  else//need to update your cookies then use this block or not
 {
    HttpCookie cookie=Request.Cookies["mycookie"];
    cookie.Value = "test";//your problem hear.
    cookie.Expires = DateTime.Now.AddDays(90);
    cookie.HttpOnly = true;  
    //response.Cookies.SetCookie(cookie);
    response.Cookies.Set(cookie);//To update a cookie, you need only to set the cookie again using the new values.
 }

希望它可以帮到你。

答案 1 :(得分:0)

问题在于这一行:return View();

无法设置cookie,然后在与服务器相同的往返中再次读取(服务器端)。因此,您需要创建第二个cookie可用的请求。最简单的方法是通过调用RedirectToAction强制执行第二个请求,尽管您可以使用一些聪明的AJAXy方法来执行此操作,因此它看起来是相同的请求。

有关工作示例,请参阅this post - 这是编写和删除cookie的部分。

public class CookieController : Controller
{

    public ActionResult Create()
    {
        HttpCookie cookie = new HttpCookie("Cookie");
        cookie.Value = "Hello Cookie! CreatedOn: " + DateTime.Now.ToShortTimeString();

        this.ControllerContext.HttpContext.Response.Cookies.Add(cookie);
        return RedirectToAction("Index", "Home");
    }

    public ActionResult Remove()
    {
        if (this.ControllerContext.HttpContext.Request.Cookies.AllKeys.Contains("Cookie"))
        {
            HttpCookie cookie = this.ControllerContext.HttpContext.Request.Cookies["Cookie"];
            cookie.Expires = DateTime.Now.AddDays(-1);
            this.ControllerContext.HttpContext.Response.Cookies.Add(cookie);
        }
        return RedirectToAction("Index", "Home");
    }

}

Ashiquizzaman也是正确的,因为你没有设置cookie的值,但这只是问题的一半。