3 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超8個(gè)贊
這是一個(gè)老問(wèn)題,但看起來(lái)沒(méi)有得到適當(dāng)?shù)慕鉀Q。在 CI 3.1.11 中,我重定向到支付網(wǎng)關(guān),當(dāng)網(wǎng)關(guān)完成支付并將控制權(quán)返回給會(huì)話時(shí),會(huì)話變量“丟失”了。
事實(shí)上,他們只是沒(méi)有重生。數(shù)小時(shí)(數(shù)天!?。┖笳{(diào)查此事并嘗試此處列出的所有選項(xiàng)和其他選項(xiàng)(均無(wú)效?。鸢冈谟谥匦律蓵?huì)話變量。
如果您的用戶僅通過(guò) LAN 訪問(wèn)系統(tǒng),那么您可能無(wú)需執(zhí)行前兩個(gè)步驟:
在 system/libraries/Session/Session.php 中注釋掉第 126 - 128 和 130 行。
//if (!isset($_SESSION['__ci_last_regenerate'])) {
// $_SESSION['__ci_last_regenerate'] = time();
//} elseif ($_SESSION['__ci_last_regenerate'] < (time() - $regenerate_time)) {
$this->sess_regenerate((bool) config_item('sess_regenerate_destroy'));
//}
原因是它在第 121 行$_SESSION['__ci_last_regenerate']之后沒(méi)有恢復(fù)。session_start()因此$this->sess_regenerate()從未執(zhí)行過(guò)。
第二步是確保注銷函數(shù)正確清除緩存以防止注銷后重新生成:
function logout() {
$this->session->sess_destroy();
$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, no-transform, max-age=0, post-check=0, pre-check=0");
$this->output->set_header("Pragma: no-cache");
redirect('logout');
}
如果您的用戶將通過(guò)移動(dòng)或 wifi 網(wǎng)絡(luò)訪問(wèn),那么您可能需要做更多的事情。在 PHP 文檔中的 PHP 函數(shù)session_regenerate_id() 上,它給出了警告:
警告 目前,session_regenerate_id 不能很好地處理不穩(wěn)定的網(wǎng)絡(luò),例如移動(dòng)和 WiFi 網(wǎng)絡(luò)。因此,您可能會(huì)通過(guò)調(diào)用 session_regenerate_id 遇到會(huì)話丟失的情況。
所以這就是我所做的:
找到session_id上次會(huì)話的。如果您的會(huì)話數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,那么以下代碼可能會(huì)很好地工作:
function latestSessionId() {
$CI = & get_instance();
$CI->db->reset_query();
$CI->db->select("id")->from($this->_config['save_path'])->order_by('timestamp','desc');
empty($this->config['match_ip']) OR $this->_db->where('ip_address', $_SERVER['REMOTE_ADDR']);
$result = $CI->db->get();
empty($result) OR $result = $result->row();
return empty($result) ? FALSE : $result->id;
}
按照此處的建議,然后在 session.php 的第 121 行執(zhí)行以下操作:
$session_id = $this->latestSessionId();
session_id($session_id);
session_start();
將功能更改sess_regenerate為:
public function sess_regenerate($destroy = FALSE) {
$_SESSION['__ci_last_regenerate'] = time();
//session_regenerate_id($destroy);
if (session_status() !== PHP_SESSION_ACTIVE) {
$session_id = $this->latestSessionId();
session_id($session_id);
session_start();
}
}
更改config.php為參數(shù)sess_expiration和具有相同的值sess_time_to_update:
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'cisession';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = TRUE;
$config['sess_time_to_update'] = 7200;

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
這個(gè)錯(cuò)誤可能是我在 codigniter 4 版本中遇到的
在你的 .env 文件中
cookie.prefix = ''
cookie.expires = 0
cookie.path = '/'
cookie.domain = ''
cookie.secure = true
cookie.httponly = false
cookie.samesite = 'None'
cookie.raw = false
此錯(cuò)誤將解決

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個(gè)贊
下面的解決方案在 Codeigniter 中對(duì)我來(lái)說(shuō)是正確的。如果您使用 重定向到支付網(wǎng)關(guān)header("Location: $url");
。只需exit();
在標(biāo)題重定向后添加即可。因?yàn)槟臅?huì)話被支付網(wǎng)關(guān)會(huì)話覆蓋,他們會(huì)為其支付網(wǎng)關(guān)啟動(dòng)新會(huì)話。添加exit();
您的會(huì)話后,只要您的會(huì)話有效,您的域就會(huì)保持不變。最終代碼將是
header("Location: $url");exit();
- 3 回答
- 0 關(guān)注
- 160 瀏覽
添加回答
舉報(bào)