我遇到一个问题,即由于与各种外部API的通信,我的某些页面需要延长一段时间才能加载。我注意到,当我更改到其他页面或在加载完成之前重新加载当前页面时,它似乎丢弃了我的会话并将我退出。
例如,如果加载页面about.php,然后在about.php完全加载之前单击链接以加载profile.php,它会将我退出并将我放回登录屏幕。
我不知道该搜索什么,但无法找到有关类似问题的任何信息。任何人都可以了解导致这种情况的原因吗?
每页顶部:
sec_session_start();
if(login_check($dp_conn) == false)
{
header("location:../login.php?error=1");
}
sec_session_start()函数:
function sec_session_start()
{
$session_name = 'sec_session_id'; // Set a custom session name
$secure = false; // Set to true if using https.
$httponly = true; // This stops javascript being able to access the session id.
ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies.
$cookieParams = session_get_cookie_params(); // Gets current cookies params.
session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly);
session_name($session_name); // Sets the session name to the one set above.
session_start(); // Start the php session
session_regenerate_id(); // regenerated the session, delete the old one.
}
login_check()函数:
function login_check($db)
{
// Check if all session variables are set
if(isset($_SESSION['user_id'], $_SESSION['username'], $_SESSION['login_string']))
{
$user_id = $_SESSION['user_id'];
$login_string = $_SESSION['login_string'];
$username = $_SESSION['username'];
$user_browser = $_SERVER['HTTP_USER_AGENT']; // Get the user-agent string of the user.
$query = "SELECT password FROM users WHERE id = " . $user_id . " LIMIT 1";
$result = mysql_query($query, $db);
if (mysql_num_rows($result) == 1)
{
// If the user exists
$row = mysql_fetch_row($result);
$password = $row[0];
$login_check = hash('sha512', $password.$user_browser);
if($login_check == $login_string)
{
// Logged In!!!!
return true;
}
else
{
// Not logged in
return false;
}
}
else
{
// Not logged in
return false;
}
}
else
{
// Not logged in
return false;
}
}
答案 0 :(得分:1)
我会添加一个答案,因为这可以帮助其他人。
因此,使用sec_session_start()
将在每个页面请求中使用不同的SESSION ID,尤其是
session_regenerate_id();
如果您的网站加载页面非常慢,并且用户在第一页未加载时打开您页面上的另一个链接,则会丢失SESSION ID,从而导致出现问题。
只需从session_regenerate_id();
功能中删除sec_session_start
。