在ajax调用期间刷新页面正在破坏php会话

时间:2016-03-07 20:11:33

标签: javascript php ajax session

当我进行AJAX调用时,我需要等待其响应才能显示给用户。

function update() {
    if (HttpReq.readyState == 4) {
        if (HttpReq.status == 200) {
            var div = document.getElementById('divAjax');
            div.innerHTML = HttpReq.responseText;
        } else {
            alert("Error: " + HttpReq.statusText);
        }
    }
}

HttpReq = new XMLHttpRequest();
HttpReq.onreadystatechange = update;
HttpReq.open('GET', 'some_url.php', true);
HttpReq.send(null);

但是,如果用户在响应之前按F5刷新屏幕,我将丢失$ _SESSION数据,这会自动将用户注销。

这是一种常见行为,还是我的代码存在问题? (我使用的是安全的会话加载器,可能存在问题。如果需要,我可以发布代码。)

问题不在于F5,它是在某些特殊情况下发生的事情,这是我发现重现行为的最简单方法。 / p>

代码:

// index.php
ini_set('session.gc_maxlifetime', 3600);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);
session_save_path('/var/www/html/plantas/sessions');
sec_session_start(); // this line called in every other .php file

// functions.php
function sec_session_start() {
    $session_name = 'sec_session_id';   // Set a custom session name
    $secure = SECURE;
    // This stops JavaScript being able to access the session id.
    $httponly = true;
    // Forces sessions to only use cookies.
    if (ini_set('session.use_only_cookies', 1) === FALSE) {
        header("Location: ../html/plantas/error.php?err=Could not initiate a safe session (ini_set)");
        exit();
    }
    // Gets current cookies params.
    $cookieParams = session_get_cookie_params();
    session_set_cookie_params($cookieParams["lifetime"],
        $cookieParams["path"],
        $cookieParams["domain"],
        $secure,
        $httponly);
    // Sets the session name to the one set above.
    session_name($session_name);

    session_start();                // Start the PHP session
    session_regenerate_id(true);
}

// every other .php file begin with
include_once '../../includes/db_connect.php';
include_once '../../includes/functions.php';
sec_session_start();

切割

session_regenerate_id(true);
来自functions.php的

并在

之后插入
// index.php
ini_set('session.gc_maxlifetime', 3600);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);
session_save_path('/var/www/html/plantas/sessions');
sec_session_start(); // this line called in every other .php file

2 个答案:

答案 0 :(得分:1)

session_regenerate_id()表示每次完整页面加载或Ajax请求调用URL时,会重命名会话。 但由于http_only=true,会话cookie在Ajax请求期间未被覆盖。 并且因为session_regenerate_id(true)删除旧会话,如果在两个完整页面加载之间存在Ajax调用,则客户端会丢失会话标识符。

在Ajax调用期间不应使用session_regenerate_id($anything)

答案 1 :(得分:0)

根据代码,你有这个行代码session_regenerate_id(true);正在做你不想要的,但为什么呢?

根据documentation

  

session_regenerate_id()将使用new替换当前会话ID   一,并保留当前的会话信息。

但是这不应该删除你的旧会话,所以发生了什么? 实际上,您将bool参数设置为true(默认为false),这告诉预处理器删除旧会话并将其替换为新会话

  

bool session_regenerate_id([bool $ delete_old_session = false])

因此解决您的问题的方法是删除本机方法中的true参数,并保持这样:session_regenerate_id();

修改

如果此请求仅用于Ajax,则启动或使用会话是多余的。除非您在提出请求之前检查用户身份验证。

相关问题