我最近升级到了Codeigniter3,它具有一个经过全面改进的会话库。我注意到,尽管Codeigniter docs的会话过期设置为0,但会话在一段时间后似乎仍在过期。
我们正在使用数据库驱动程序,并且我们的配置选项设置如下:
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 0;
$config['sess_save_path'] = 'user_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
$config['cookie_prefix'] = '';
$config['cookie_domain'] = $_SERVER['HTTP_HOST'];
$config['cookie_path'] = '/';
$config['cookie_secure'] = FALSE;
$config['cookie_httponly'] = FALSE;
如您所见。在屏幕截图中,会话将存储在数据库中:
该应用程序设置有基本控制器,如果未设置我们的user_data
会话数组,该控制器将重定向到登录页面。我猜在这种情况下,会话到期是可以的,因为它可以重定向并且一切正常。
但是,如果会话到期(或发生了什么事情),然后单击一个进行ajax调用的按钮,则该调用将失败,并且在开发人员工具中我可以看到它正在尝试重定向到登录页面,但是用户只是看到我的错误,表明ajax调用失败。
从我正在阅读的内容来看,CodeIgniter会话库似乎存在一些问题,我想知道我是否正在处理该问题,或者我的实现是否不好。
我无法理解会话即将到期或重新生成,并且会话ID可能不同吗? ajax调用是否以某种方式引用了会话ID?在进行ajax调用时,我没有在应用程序中编写任何代码来查看会话。
我在想可以在控制器功能中添加类似的内容?
if(!$this->session->userdata('user_data'))
{
echo 'some not logged in message'
{
然后在我的javascript中基本上检查该响应并重定向,但这是在我的整个应用程序中要更改的许多代码,我想确保这是正确的方法,然后再沿着那条路走。
我想知道this old SO answer在Codeigniter 3中是否仍然有用?
还有两点需要注意:
session_start()
$this->session->sess_destroy();
更新:
如上所述,我找到了一种解决方法,在该方法中,我进行了一些检查以查看它是否是ajax调用,如果不处理会话检查并在PHP中重定向,如果是的话,则从ajax调用发送回响应,然后重定向到登录页面。
原始问题仍然存在:
会话为什么会过期?会话重新生成后,如何防止ajax调用失败?上面的“解决方案”不理想,因为该应用程序在工作时间定期使用,我不希望用户每隔x分钟注销一次。
更新2:
我在SO的其他地方看到有人说不自动加载会话库,尽管没有人对此进行解释,并且文档中没有任何内容表明不应这样做。实际上,在配置文件中,它是它们引用的示例自动加载库之一。我为什么不应该这样做?