重新加载部分页面时会丢失会话

时间:2014-09-29 21:30:12

标签: php mysql session session-state sha512

我遇到一个问题,即由于与各种外部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;
    }
}

1 个答案:

答案 0 :(得分:1)

我会添加一个答案,因为这可以帮助其他人。 因此,使用sec_session_start()将在每个页面请求中使用不同的SESSION ID,尤其是

session_regenerate_id();

如果您的网站加载页面非常慢,并且用户在第一页未加载时打开您页面上的另一个链接,则会丢失SESSION ID,从而导致出现问题。

只需从session_regenerate_id();功能中删除sec_session_start