django中是否还有如果用户有两个打开的选项卡,两个都已注销,然后在一个选项卡中登录,告诉他已登录另一个选项卡?我的意思是像github那样告诉你已登录,请刷新页面。
现在问题是如果我在一个标签中登录,然后在第二个标签中登录,我会csrf token missing incorrect.
答案 0 :(得分:1)
您得到csrf token missing incorrect.
因为当用户重新登录时,服务器会为cookie生成一个新的csrf令牌。 Cookie会在同一个域中保留。当您尝试在当前页面上执行smth时,请求将失败,因为<form>
中的csrf与已更改的cookie不同。这就是为什么github刷新页面(而不是承认从它做请求)。因此,服务器会将html中的新csrf返回到您的表单。
修改强>:
考虑以下选择:
setInterval
,您可以在其中检查用户加载页面的会话以及来自cookie的当前会话。答案 1 :(得分:1)
我不知道github到底是怎么做到的。但有一种可能性是使用visibilitychange
事件处理程序。切换选项卡时会触发此操作。事件处理程序可以检查当前站点的cookie,并确定是否有人登录了另一个选项卡。
https://developer.mozilla.org/en-US/docs/Web/Events/visibilitychange
通常标签不共享状态。但是两个选项卡具有相同的来源(域名),它们共享cookie。在django中,您通常使用模板标记{% csrf_token %}
将csrf标记呈现给html dom,这意味着如果当前标签的csrf标记无效(登录时会发生这种情况),则必须刷新页面才能获得新鲜的令牌。
附加此类事件侦听器的一种方法是:
// check cookie for `logged_in` substring (this only works for insecure cookies. Not http-only)
const isLoggedIn = () => document.cookie.includes('logged_in')
// check cookie for changes when you open this tab
const signInSpy = () => {
document.visibilitystate === 'visible' &&
isLoggedIn() &&
alert('refresh, please')
}
// only attach event handler when not signed in.
document.onvisibilitychange = isLoggedIn() ? null : signInSpy
此示例仅在logged_in
不是仅限http的cookie时才有效。有关标签之间进行通信的其他选项,请参阅以下问题:
Communication between tabs or windows