Python django在另一个选项卡中检测用户登录
django中是否存在这样的情况:如果用户有两个打开的选项卡,都已注销,然后在一个选项卡中登录,告诉用户他已在另一个选项卡中登录?我的意思是像github这样的东西告诉你你已经登录了,请刷新页面Python django在另一个选项卡中检测用户登录,python,django,csrf,django-csrf,Python,Django,Csrf,Django Csrf,django中是否存在这样的情况:如果用户有两个打开的选项卡,都已注销,然后在一个选项卡中登录,告诉用户他已在另一个选项卡中登录?我的意思是像github这样的东西告诉你你已经登录了,请刷新页面 现在的问题是,如果我在一个选项卡中登录,然后在第二个选项卡中登录,我会发现csrf令牌丢失不正确。您会发现csrf令牌丢失不正确。因为当用户重新登录时,服务器会向cookie生成一个新的csrf令牌。cookie在同一个域中持久存在。当您试图在当前页面上执行smth时,请求失败,因为中的csrf与已更改
现在的问题是,如果我在一个选项卡中登录,然后在第二个选项卡中登录,我会发现
csrf令牌丢失不正确。
您会发现csrf令牌丢失不正确。
因为当用户重新登录时,服务器会向cookie生成一个新的csrf令牌。cookie在同一个域中持久存在。当您试图在当前页面上执行smth时,请求失败,因为
中的csrf与已更改的cookie不同。这就是为什么github刷新页面(而不是从页面中执行请求)。因此,服务器将以html格式将新的csrf返回到您的表单中
编辑:
考虑以下选择:
- 如果您的cookie不是只读的:。设置
,检查用户从cookie加载页面的会话和当前会话setInterval
- 将前4个字符也呈现在页面上,并将其保存到变量中。在页面加载时设置此变量。并在每个请求中传递带有头的变量。添加一个检查头中的前4个字符是否匹配cookie中的前4个字符,以及它是否没有告诉客户端刷新页面
- 如果您想自动检测您的案例,您需要经常向服务器发送垃圾邮件,并询问会话是否已更改。从客户端可以发送旧会话和新会话(如果会话为只读,则可以从服务器发送前几个字符)李>
- 我不知道github是如何做到这一点的。但一种可能性是使用
事件处理程序。这将在切换选项卡时触发。事件处理程序可以检查当前站点的cookie,并确定是否有人登录了其他选项卡 通常选项卡不共享状态。但是两个标签有相同的来源(域名),它们共享cookie。在django中,通常使用模板标记visibilitychange
将csrf令牌呈现到html dom,这意味着如果当前选项卡的csrf令牌无效(登录时发生),则必须刷新页面以获得新的令牌 连接此类事件侦听器的一种方法是:{%csrf_token%}
仅当登录的//检查cookie中的'logged_in'子字符串(这仅适用于不安全的cookie,而不仅仅是http) const isLoggedIn=()=>document.cookie.includes('logged_in')) //打开此选项卡时检查cookie是否有更改 常量符号=()=>{ document.visibilitystate===“可见”&& 伊斯洛格丁()&& 警报('请刷新') } //仅在未登录时附加事件处理程序。 document.onvisibilitychange=isLoggedIn()?空:signInSpy
不是仅http的cookie时,此示例才有效。有关选项卡之间通信的其他选项,请参见此问题: