我使用刷新创建了一个与PHP / MYSQL的ajax聊天:
var Alive = setInterval(function(){ /*ajax*/ }, 5000);
效果很好!但我正在寻找一种方法来同时防止2个会话(如果用户在桌面上连接然后继续移动而不离开)导致脚本将继续并刷新脚本的第一个会话。任何的想法 ?也许取消/重定向旧会话?我不知道
答案 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状态时,停止脚本循环。