ajax刷新脚本阻止会话

时间:2018-03-26 19:12:44

标签: php mysql ajax

我使用刷新创建了一个与PHP / MYSQL的ajax聊天:

var Alive = setInterval(function(){ /*ajax*/ }, 5000);

效果很好!但我正在寻找一种方法来同时防止2个会话(如果用户在桌面上连接然后继续移动而不离开)导致脚本将继续并刷新脚本的第一个会话。任何的想法 ?也许取消/重定向旧会话?我不知道

1 个答案:

答案 0 :(得分:1)

由于您的聊天使用身份验证,因此您可以使用访问令牌。

每次用户登录时,都会创建一个新令牌(例如,根据用户的ID和当前时间戳的哈希值)并将其存储到用户表和会话中的数据库中。 ($_SESSION['accessToken'] = $token) 当用户手动断开连接时,将列设置为null。

现在,每次服务器收到请求时,请检查令牌。如果会话一与数据库匹配,则可以,否则用户从其他地方登录或在此期间关闭浏览器。在这种情况下,请调用断开连接功能。

要确保用户保持不变,请在每次请求时生成新令牌。

您可以使用与此类似的内容来检查令牌是否匹配:

    $db = getDB();
    $query = $db->prepare('SELECT 1 FROM users WHERE email=:email AND access_token=:accessToken;');
    $query->execute([
            "email"         => $_SESSION["email"], /* Assuming you store the user's info into the session when he logs in */
            "accessToken"   => $_SESSION["accessToken"]
    ]);

    if($query->rowCount()) {
        //The user didn't change device/browser
        $query->closeCursor();
        $_SESSION["accessToken"] = generateAccessToken($_SESSION["email"]);
        //Don't forget to update the token in the database too
    } else {
        //The user changed device/browser without disconnecting manually
        $query->closeCursor();
        disconnectUser(); //Destroys the session and sets the access token to null
    }

现在用户已断开连接,您可以使用403 Forbidden HTTP状态代码进行响应。收到403状态时,停止脚本循环。