3 回答

TA貢獻1799條經驗 獲得超8個贊
這是一個老問題,但看起來沒有得到適當的解決。在 CI 3.1.11 中,我重定向到支付網關,當網關完成支付并將控制權返回給會話時,會話變量“丟失”了。
事實上,他們只是沒有重生。數小時(數天!?。┖笳{查此事并嘗試此處列出的所有選項和其他選項(均無效?。?,答案在于重新生成會話變量。
如果您的用戶僅通過 LAN 訪問系統,那么您可能無需執行前兩個步驟:
在 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']之后沒有恢復。session_start()因此$this->sess_regenerate()從未執行過。
第二步是確保注銷函數正確清除緩存以防止注銷后重新生成:
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');
}
如果您的用戶將通過移動或 wifi 網絡訪問,那么您可能需要做更多的事情。在 PHP 文檔中的 PHP 函數session_regenerate_id() 上,它給出了警告:
警告 目前,session_regenerate_id 不能很好地處理不穩定的網絡,例如移動和 WiFi 網絡。因此,您可能會通過調用 session_regenerate_id 遇到會話丟失的情況。
所以這就是我所做的:
找到session_id上次會話的。如果您的會話數據存儲在數據庫中,那么以下代碼可能會很好地工作:
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 行執行以下操作:
$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為參數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貢獻1826條經驗 獲得超6個贊
這個錯誤可能是我在 codigniter 4 版本中遇到的
在你的 .env 文件中
cookie.prefix = ''
cookie.expires = 0
cookie.path = '/'
cookie.domain = ''
cookie.secure = true
cookie.httponly = false
cookie.samesite = 'None'
cookie.raw = false
此錯誤將解決

TA貢獻1824條經驗 獲得超6個贊
下面的解決方案在 Codeigniter 中對我來說是正確的。如果您使用 重定向到支付網關header("Location: $url");
。只需exit();
在標題重定向后添加即可。因為您的會話被支付網關會話覆蓋,他們會為其支付網關啟動新會話。添加exit();
您的會話后,只要您的會話有效,您的域就會保持不變。最終代碼將是
header("Location: $url");exit();
- 3 回答
- 0 關注
- 154 瀏覽
添加回答
舉報