Codeigniter3会话库,Ajax和会话过期

时间:2018-10-10 13:03:17

标签: php ajax session codeigniter-3

我最近升级到了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;

如您所见。在屏幕截图中,会话将存储在数据库中:

enter image description here

该应用程序设置有基本控制器,如果未设置我们的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的其他地方看到有人说不自动加载会话库,尽管没有人对此进行解释,并且文档中没有任何内容表明不应这样做。实际上,在配置文件中,它是它们引用的示例自动加载库之一。我为什么不应该这样做?

0 个答案:

没有答案