我正在尝试更改一个MVC网站,该网站在Session中存储了一些信息以将其存储在cookie中,但是我遇到了cookie过期的一些问题。
方案 登录到站点时,会创建一个cookie并将其添加到当前的HttpContext Response cookie集合中。用于编写cookie的代码如下:
HttpCookie userCredsCookie = _context.Response.Cookies.Get(Constants.Web.UserCredentialsCookieName) ?? new HttpCookie(Constants.Web.UserCredentialsCookieName);
userCredsCookie.HttpOnly = true;
userCredsCookie.Secure = true;
userCredsCookie.Value = user.ID.ToString();
userCredsCookie.Expires = DateTime.Now.AddMinutes(user.CompanySessionTimeout + user.TimezoneOffset);
_context.Response.Cookies.Add(userCredsCookie);
我已经尝试删除设置cookie过期的行,并发现cookie是按预期生成并存储在客户端的。
当我使用Fiddler检查来自服务器的响应时,我可以看到正在返回userCreds cookie:
Response sent 111 bytes of Cookie data:
Set-Cookie: UserCreds=e2ce8200-fb38-45b9-8aec-4d93e6640a84; expires=Mon, 09-Oct-2017 16:20:43 GMT; path=/; secure; HttpOnly
当未设置到期时,响应具有:
Response sent 72 bytes of Cookie data:
Set-Cookie: UserCreds=e2ce8200-fb38-45b9-8aec-4d93e6640a84; path=/; secure; HttpOnly
只要未设置到期日期,浏览器就会接受cookie,并根据浏览器发出的后续请求发送。
感觉问题是由于响应中日期的格式,但我找不到任何允许我更改格式的内容。
非常感谢任何帮助。
此致 蒙蒂
更新 - 可能的原因
我发现我遇到的问题与时间有关。似乎我的开发人员可能正在处理来自ajax调用的响应,该调用设置了cookie太快(???甚至可能???)。
当我调试前端代码以确保从这个角度看起来很好的时候我发现通过在将window.location设置为ajax调用结果中的url的行之前放置一个断点,随后的调用是在请求中使用cookie。
也许,通过使回调的处理暂停,给系统时间来持久化cookie。我假设持久化cookie的过程是进行验证检查然后存储数据。这意味着在设置到期日期时验证cookie需要更长的时间。也许没有到期设置的cookie持续存在但是有效期的cookie不是因为新url的加载中断了进程,从而导致cookie无法存储。
通过在ajax调用的成功处理程序中添加1毫秒的延迟(是的,只有1毫秒),我能够成功地将cookie保存到浏览器并包含在调用中,以加载返回的URL ajax的反应。
这听起来有可能吗?
答案 0 :(得分:0)
尝试使用此代码
$results[] = array(
"value" => $res['DS'],
"desc" => $res['ORG_NAME'],
"img" => "http://lorempixel.com/50/50/?" . (rand(1, 10000) . rand(1, 10000)),
"tokens" => array($query, $query . rand(1, 10))
);
然后传递
int result = Convert.ToInt32(user.CompanySessionTimeout.ToString()) + Convert.ToInt32(user.TimezoneOffset)