gpt4 book ai didi

javascript - ajax 调用期间刷新页面正在破坏 php session

转载 作者:行者123 更新时间:2023-12-03 07:29:35 24 4
gpt4 key购买 nike

当我进行 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 数据,这会自动将用户注销。

这是一种常见行为,还是我的代码有问题? (我正在使用安全 session 加载器,也许问题就在那里。如果需要,我可以发布代码。)

问题并不完全出在 F5 上,而是在某些特殊情况下发生的问题,这只是我发现的重现该行为的最简单方法。

代码:

// 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

最佳答案

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

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

关于javascript - ajax 调用期间刷新页面正在破坏 php session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35853073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com