当我进行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
答案 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);
正在做你不想要的,但为什么呢?
session_regenerate_id()将使用new替换当前会话ID 一,并保留当前的会话信息。
但是这不应该删除你的旧会话,所以发生了什么?
实际上,您将bool
参数设置为true
(默认为false
),这告诉预处理器删除旧会话并将其替换为新会话
bool session_regenerate_id([bool $ delete_old_session = false])
因此解决您的问题的方法是删除本机方法中的true
参数,并保持这样:session_regenerate_id();
修改
如果此请求仅用于Ajax,则启动或使用会话是多余的。除非您在提出请求之前检查用户身份验证。