php:区分重新加载登录表单和重复登录

php:区分重新加载登录表单和重复登录,php,forms,session-variables,reload,Php,Forms,Session Variables,Reload,我正在用PHP构建一种web应用程序。我有一个登录表单,在会话变量中存储一个令牌,它基本上告诉服务器用户在线(这也存储在数据库中)。当显示登录表单(新登录…或注销时-此处代码中未显示)时,此令牌清除。成功登录时,我还将会话_id()存储在数据库中 为了防止打开两个会话(在同一浏览器或不同浏览器中),我执行了两种类型的检查: 如果用户仅在登录后打开第二个选项卡,我将检查此令牌和http引用。如果令牌不为空(表示有人登录),http引用为空(表示新选项卡/窗口已打开),我将回显错误消息(“您已经有一

我正在用PHP构建一种web应用程序。我有一个登录表单,在会话变量中存储一个令牌,它基本上告诉服务器用户在线(这也存储在数据库中)。当显示登录表单(新登录…或注销时-此处代码中未显示)时,此令牌清除。成功登录时,我还将会话_id()存储在数据库中

为了防止打开两个会话(在同一浏览器或不同浏览器中),我执行了两种类型的检查:

  • 如果用户仅在登录后打开第二个选项卡,我将检查此令牌和http引用。如果令牌不为空(表示有人登录),http引用为空(表示新选项卡/窗口已打开),我将回显错误消息(“您已经有一个打开的会话…”)

  • 如果用户在登录之前打开了两个选项卡,我会检查DB中的这个令牌和会话_id()以及当前的一个。如果令牌在那里(意味着有人登录),并且DB和当前会话_id()相同(意味着我们仍然在同一个浏览器中),我会回显一条错误消息(“您已经有一个打开的会话…”)。这里的session_id()是否会有所不同,这意味着我们在另一个浏览器中,我也在对此进行检查

  • 同时,我试图阻止用户重新发布登录表单,这意味着,我希望他们避免在登录后立即单击“重新加载”

    问题:
    在上面的设置中,如果我单击“重新加载”,服务器将认为这是第二个浏览器选项卡登录(上面的案例2),因为令牌将在那里,会话id()也将相同,因此它将回显错误消息(“您已经有一个打开的会话…”)

    有没有一种方法可以组合too并确保在登录表单重新加载时不会发生任何事情

    代码看起来是这样的(我试图去掉不必要的代码,如果不是100%正确的话,很抱歉):

    
    同时,我试图阻止用户重新发布
    登录表单,意思是,我希望他们避免点击右键重新加载
    他们登录之后

    为了防止这种情况,您应该遵循这种模式,并在成功发布后始终重定向。i、 e.如果登录成功,将其重定向到启动页或主页等


    其次,如果用户登录并通过另一个选项卡浏览,他或她将拥有与第一个选项卡相同的会话ID。这是除非他们打开了一个新的私人浏览/匿名窗口,或者他们正在使用代理。

    我现在在每个页面的顶部都有一个带有
    exit()的登录表单,只有在成功登录的情况下才会跳过。你的意思是我应该创建一个独立的登录页面以使其正常工作吗?你可能没有收到我以前的注释…?我已经实现了这个方法,它工作得很好,谢谢!为了进一步帮助那些正在寻找PRG的实际实现的人:在这篇文章中寻找timdev的答案:。
    
    <?php function LoginForm() { 
    $_SESSION['token'] = ''; ?>
    <form action="<?php echo htmlspecialchars($_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING']); ?>" method="post">
        Please enter your login details</div><br />
        Login ID<br />
        <input type="text" name="userid" /><br /><br />            
        Password<br />
        <input type="password" name="password" /><br /><br />
        <input type="submit" name="login" value="Login" />
    </form>
    <?php }
    
    if (!empty($token_in_DB) AND !isset($_SERVER['HTTP_REFERER'])) {
        echo "You are already logged in on another tab / window";
        exit();
    } elseif (isset($_POST['login'])) {
    if (!empty($token_in_DB)) {
        if ($session_in_DB == session_id()) {
                echo "You are already logged in on another tab / window";
                exit();
        } else { 
                echo "You are already logged in on another browser / computer";
                exit();
                }
        } elseif (/* password is ok */) {       
            // login
            // set token session variable
            // add token to db   
        }
    } elseif (empty($_SESSION['token'])) {
        LoginForm();
    } ?>