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