这个简单的代码让我感到困惑。
从这个控制器动作方法,我创建一个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();
}
答案 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的值,但这只是问题的一半。