我正在尝试实现一种身份验证机制,其中每个浏览器选项卡都可以以不同的用户身份登录。
下面是这个系统的规则:
到目前为止我尝试过的:
cookies
对于私有(private)和公共(public) token :这不起作用,因为服务器无法知道要查看哪个 cookie。如果用户单击选项卡内的链接,则请求会跨所有选项卡和服务器发送所有 cookie无法知道哪个人点击了链接。 sessionStorage
:这不起作用,因为当用户单击链接时,无法指定应与 HTTP GET 请求一起发送的自定义 header 。 <form method="get" enctype="multipart/form-data">
并使用隐藏字段传递 token : enctype="multipart/form-data"仅支持 POST。 <form method="post" enctype="multipart/form-data">
并使用隐藏字段传递 token :理论上,这应该可行,但现在如果用户使用后退/前进按钮,则会提示用户重新提交表单数据。 document.open(); document.write(); document.close()
重写当前页面.我都试过了 https://stackoverflow.com/a/4404659/14731和 http://forums.mozillazine.org/viewtopic.php?p=5767285&sid=d6a5a2e8e311598cdbad124e277e0f52#p5767285在这两种情况下,新 <head>
中的脚本块永远不会被执行。 有任何想法吗?
最佳答案
好的,在经历了许多不同的迭代之后,这是我们最终得到的实现:
变量
publicToken
, nextTabId
. privateToken
, tabId
. 公有 token ,私有(private) token
publicToken
是上次登录操作返回的 token ,跨所有选项卡。 privateToken
是当前标签页上次登录操作返回的token。 标签ID
tabId
的 token 唯一标识。 . nextTabId
是一个可跨所有选项卡访问的数字。 nextTabId
创建一个新的并增加其值。 tabId
可能具有“com.company.Tab X
”的值,其中 X
是 nextTabId
返回的数字. 登录/退出
privateToken
和 publicToken
使用服务器返回的身份验证 token 覆盖。 privateToken
和 publicToken
在浏览器端,和 privateToken
在服务器端。我们不删除publicToken
在服务器端。 privateToken
也会被注销。使用不同 token 的任何选项卡都不会受到影响。 privateToken
?当您在新窗口或选项卡中打开链接时,它会继承 privateToken
父选项卡。 publicToken
在服务器上,使用 privateToken
退出的选项卡X, publicToken
Y 会导致带有 privateToken
的制表符Y 退出(这是不可取的)。 在页面加载时
tabId
URL 的查询参数。参数值等于tabId
的值. tabId
来自当前页面的 URL 参数使用 history.replaceState()所以用户可以与他们的 friend 分享链接(tabId
是特定于用户的,不能分享)。 tabId
cookie(更多内容见下文)。 单击链接时
tabId
cookie 并点击链接。 tabId
并且值等于 privateToken
的值当服务器收到请求时
tabId
缺少参数,则将浏览器重定向到 GetTabId.html?referer=X
哪里X
是当前的 URL。 tabId
存在但身份验证 token 无效或已过期,然后将浏览器重定向到登录屏幕。 获取TabId.html
privateToken
, 复制 publicToken
进入 privateToken
. privateToken
和 publicToken
未定义,重定向到登录页面。 referer
的 URL 参数。这表明成功时重定向到的位置。 privateToken
, 附加 tabId
referer
的参数页面并重定向回它。 window.location.replace()
重定向时删除 GetTabId.html
从浏览器历史记录。 为什么我们不断删除/添加 cookie?
tabId
cookie 在页面加载时,那么每次选项卡发出请求时,所有其他选项卡的 cookie 也会被发送。 已知的问题
tabId
.结果,它获取重定向到 GetTabId.html
的页面的源代码。而不是实际页面。 GetTabId.html
并返回原始页面)。 为冗长的实现细节道歉,但我找不到更简单/更短的解决方案。
关于html - 将特定于选项卡的数据绑定(bind)到 HTTP GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26556749/