我使用刷新使用php/mysql创建了一个ajax聊天:
var Alive = setInterval(function(){ /*ajax*/ }, 5000);
它运行良好!但是,我正在寻找一种在同一时间预防2个会话的方法(例如,如果用户在桌面上连接,然后在不休假的情况下进行移动(,因为脚本将继续并刷新脚本的第一个会话。任何想法 ?也许取消/重定向较旧的会话?我不知道
当您的聊天使用身份验证时,您可以使用访问令牌。
用户登录时,创建一个新的令牌(例如,基于用户ID和当前时间戳的哈希(,然后将其存储到用户表和会话中的数据库中。($_SESSION['accessToken'] = $token
(用户手动断开连接时将列设置为空。
现在,每次服务器收到请求时,请检查令牌。如果会话一匹配数据库一个,则可以,否则用户从其他地方登录或在此期间关闭了他的浏览器。在这种情况下,调用您的断开函数。
真正确定用户保持不变,也可以在每个请求下生成新的令牌。
您可以使用类似的东西检查令牌是否匹配:
$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禁止的HTTP状态代码响应。收到403状态时,请阻止您的脚本循环。