【发布时间】:2021-07-14 06:32:46
【问题描述】:
我有一个 index.php 来检查用户是否登录,如果没有,它会将用户重定向到登录页面,如下所示:
<?php
session_start();
$_SESSION["page_identifier"] = "index";
include "inc/header.php";
if(!isset($_SESSION["loggedin"]) OR !$_SESSION["loggedin"] == TRUE){
echo "ERROR: Not logged in!";
header("Refresh: 3; url = login.php");
}
else{
......
}
?>
这是登录页面。
<?php
$_SESSION["page_identifier"] = "login";
$_SESSION["form_identifier"] = "login";
include "inc/header.php";
?>
<div>
<form action="submission.php" name="login" method="POST">
<input class="textBox" type="text" name="username" placeholder="Enter your username" maxlength="20"/>
<input class="textBox" type="password" name="password" placeholder="Enter your password" maxlength="20"/><br><br>
<input class="button" type="submit" value="Submit"/>
</form>
<form class="register" action="register.php">
<input class="button" type="submit" value="New user? Register"/>
</form>
</div>
<?php include "inc/footer.php"; ?>
每个页面都将$_SESSION["form_identifier"]设置为其页面名称,当提交表单时,我会检查提交文件的来源,如下所示:
<?php
session_start();
$_SESSION["page_identifier"] = "submission";
//checking if the form is a login form.
if($_SESSION["form_identifier"] == "login"){
.......
}
它表明from来自“NULL”而不是来自“login”。为什么会发生这种情况,有没有办法改变这种情况?
【问题讨论】:
-
您似乎忘记在登录页面顶部输入
session_start(); -
附言。只是一个提示,如果用户在浏览器的多个选项卡中打开您的网站,然后在它们之间不断切换,则将页面标识符放入会话中会导致意外行为和可能的错误 - 这是很常见的行为。这些选项卡将共享同一个会话,因此很容易看到服务器上可能会混淆请求实际上来自哪个页面。浏览器的使用不一定是一个线性过程。
-
嗯,具体细节取决于一点点。您的网站是否有任何公共页面,或者除了登录页面之外都是私有的?在哪些情况下您实际上需要知道您来自来自的页面/URL(而不是现在正在处理的页面/URL)?根据我对这类事情的经验,有必要知道登录页面的 URL,以便在加载登录页面时,代码不会出现“用户未登录,重定向到登录页面”,并且从而创建一个无限循环...
-
...您需要知道现在在哪个页面上的唯一其他时间是某些页面是私有的,而某些页面是公开的,所以再次,您可以决定如果用户未登录是否需要重定向。这可以通过列出需要用户登录的页面及其 URL 的列表(在文件或数据库中)来实现。或者您将代码放入每个检查的页面中,但是您通常最终会得到冗余代码 - 最好集中它。
-
是的,这确实是正确的方法。