Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django在另一个选项卡中检测用户登录_Python_Django_Csrf_Django Csrf - Fatal编程技术网

Python django在另一个选项卡中检测用户登录

Python django在另一个选项卡中检测用户登录,python,django,csrf,django-csrf,Python,Django,Csrf,Django Csrf,django中是否存在这样的情况:如果用户有两个打开的选项卡,都已注销,然后在一个选项卡中登录,告诉用户他已在另一个选项卡中登录?我的意思是像github这样的东西告诉你你已经登录了,请刷新页面 现在的问题是,如果我在一个选项卡中登录,然后在第二个选项卡中登录,我会发现csrf令牌丢失不正确。您会发现csrf令牌丢失不正确。因为当用户重新登录时,服务器会向cookie生成一个新的csrf令牌。cookie在同一个域中持久存在。当您试图在当前页面上执行smth时,请求失败,因为中的csrf与已更改

django中是否存在这样的情况:如果用户有两个打开的选项卡,都已注销,然后在一个选项卡中登录,告诉用户他已在另一个选项卡中登录?我的意思是像github这样的东西告诉你你已经登录了,请刷新页面


现在的问题是,如果我在一个选项卡中登录,然后在第二个选项卡中登录,我会发现
csrf令牌丢失不正确。
您会发现
csrf令牌丢失不正确。
因为当用户重新登录时,服务器会向cookie生成一个新的csrf令牌。cookie在同一个域中持久存在。当您试图在当前页面上执行smth时,请求失败,因为
中的csrf与已更改的cookie不同。这就是为什么github刷新页面(而不是从页面中执行请求)。因此,服务器将以html格式将新的csrf返回到您的表单中

编辑

考虑以下选择:

  • 如果您的cookie不是只读的:。设置
    setInterval
    ,检查用户从cookie加载页面的会话和当前会话
  • 将前4个字符也呈现在页面上,并将其保存到变量中。在页面加载时设置此变量。并在每个请求中传递带有头的变量。添加一个检查头中的前4个字符是否匹配cookie中的前4个字符,以及它是否没有告诉客户端刷新页面
  • 如果您想自动检测您的案例,您需要经常向服务器发送垃圾邮件,并询问会话是否已更改。从客户端可以发送旧会话和新会话(如果会话为只读,则可以从服务器发送前几个字符)
      我不知道github是如何做到这一点的。但一种可能性是使用
      visibilitychange
      事件处理程序。这将在切换选项卡时触发。事件处理程序可以检查当前站点的cookie,并确定是否有人登录了其他选项卡

      通常选项卡不共享状态。但是两个标签有相同的来源(域名),它们共享cookie。在django中,通常使用模板标记
      {%csrf_token%}
      将csrf令牌呈现到html dom,这意味着如果当前选项卡的csrf令牌无效(登录时发生),则必须刷新页面以获得新的令牌

      连接此类事件侦听器的一种方法是:

      //检查cookie中的'logged_in'子字符串(这仅适用于不安全的cookie,而不仅仅是http)
      const isLoggedIn=()=>document.cookie.includes('logged_in'))
      //打开此选项卡时检查cookie是否有更改
      常量符号=()=>{
      document.visibilitystate===“可见”&&
      伊斯洛格丁()&&
      警报('请刷新')
      }
      //仅在未登录时附加事件处理程序。
      document.onvisibilitychange=isLoggedIn()?空:signInSpy
      
      仅当登录的
      不是仅http的cookie时,此示例才有效。有关选项卡之间通信的其他选项,请参见此问题: