我希望在ASP.NET MVC应用程序中,每当用户打开新的浏览器选项卡或窗口时,都能创建唯一的会话。在ASP.NET/MVC中是否可能实现?
我尝试了以下解决方案:
asp.net - session - multiple browser tabs - different sessions?
但是它在ASP.NET MVC中无效。上面的解决方案使用ViewState,在MVC中我尝试使用TempData,但它不起作用。
我希望在ASP.NET MVC应用程序中,每当用户打开新的浏览器选项卡或窗口时,都能创建唯一的会话。在ASP.NET/MVC中是否可能实现?
我尝试了以下解决方案:
asp.net - session - multiple browser tabs - different sessions?
但是它在ASP.NET MVC中无效。上面的解决方案使用ViewState,在MVC中我尝试使用TempData,但它不起作用。
多年过去了,我终于找到了解决这个问题的方法:
1.) 浏览器必须自行提供ID,因为HTTP是无状态的,cookie不会单独存储浏览器标签页,ASP.NET会话也不能区分单个标签页。
2.) 在打开新标签页时,JS窗口名称为''。将窗口名称更改为某个值后,只要标签页仍然存在且没有被某些代码更改,它就不会再更改。
因此,解决方案是:在 *.master 或每个 *.aspx 文件中实现一些简短的JS代码:
if (typeof window.name != undefined) {
if (window.name == '') {
var d = new Date();
window.name = '_myWnd_' + d.getUTCHours() + d.getUTCMinutes() + d.getUTCSeconds() + d.getUTCMilliseconds();
}
var eDiv = document.getElementById('div_BrowserWindowName');
var e = eDiv.getElementsByTagName('input')[0];
e.value = window.name;
}
<div id="div_BrowserWindowName" style="visibility:hidden;">
<asp:HiddenField ID="hf_BrowserWindowName" runat="server" />
</div>
现在,您可以在每次回传后通过读取隐藏字段来检索窗口名称 == 唯一标识符,即使用户在跳转到其他网站并在几小时后返回表单。
public ActionResult List(string guid)
{
if (guid == null)
{
return RedirectToAction("List", new { guid = Guid.NewGuid().ToString() });
}
...
每当您点击“列表”链接并定位到新标签时,都会生成一个新的GUID。
b) 我有一个带有GUID的会话密钥,因此每个页面都有自己的值。您可以同时打开2个标签,并且它们将使用不同的会话值,因为GUID将是不同的。
这种解决方案并不完美,但至少它能够正常运作。
希望这些能够有所帮助。
var uniqueId = "<%= Guid.NewGuid().ToString() %>";
window.sessionStorage.setItem("tabId", uniqueId);
然后在每个需要会话的控制器操作中,您都要传递该参数:
window.sessionStorage.getItem("tabId");