【问题标题】:codeigniter session expires frequentlycodeigniter 会话经常过期
【发布时间】:2022-02-12 21:16:06
【问题描述】:

我正在为我的应用使用 codeigniter

即使用户在网站上处于活动状态,我的问题是会话即将到期。

这些是会话设置.. 我正在使用数据库会话

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = TRUE;
$config['sess_table_name']      = 'edu_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update']  = 300;

任何解决方案。

帮帮我,我必须解决它

这里是代码点火器forum link

【问题讨论】:

  • 您确定会话已正确保存到数据库中吗?
  • 我不知道,但是当我在会话中使用更多数据时,如果启用了 dbsession 选项,那么只有会话工作,否则它不工作

标签: codeigniter session


【解决方案1】:

我遇到了 CI 会话随机过期的问题。您是否有加载会话库的 AJAX 或动态资源?如果是这样,想象一下这种情况:

我提交了一个 ajax 请求(它通过 cookie 传递了我的 CI 会话 ID),它返回了结果,但我还提交了一些其他请求(加载动态图像、另一个 AJAX 请求等)紧跟第一个请求。第一个请求可能会触发 300 秒的“是时候更新了”事件,并传回一个新的 cookie,但附加请求发送的是旧会话 id,对吧?

所以,CodeIgniter 说“嘿,你不能那样做”并创建一个新会话,使我的浏览器现在不知道如何处理的两个 cookie 无效。

这是我不久前发布的一个论坛链接,其中包含更多详细信息: http://codeigniter.com/forums/viewthread/172415/

【讨论】:

  • 谢谢兰登。我的应用程序有很多动态 ajax 调用,就像你解释的那样。如果您对此有解决方案,请告诉我。这是我的应用程序中的一个严重问题。谢谢
  • 我会扩展 Session 类,并编写您自己的 sess_destroy 函数来检查 INPUT::is_ajax_request() 函数以防止 ajax 请求的正常会话过期。请记住,sess_read 函数每次调用 sess_destroy() 函数时都会返回 FALSE,因此您也需要覆盖它。想要一个有效的例子吗?
  • 是的,给我一个工作示例,这样我就可以快速完成。谢谢
  • 嗨@landons,您发布的链接似乎已失效,您是否有一个工作示例或其他链接到您在CI 2.2-stable 上描述的内容?到今天为止,我已经得到了最新的,而会话在将近 3 年后仍然被破坏。
  • @mtpultz,我没有,但我对当前 CI 项目的“修复”是将会话轮换间隔设置为与会话到期配置相同的值。请记住,对于备受瞩目、高度安全意识的项目来说,这不是一个好的解决方案
【解决方案2】:

如第一个答案中所述,会话库中存在竞争条件,此后在 CodeIgniter 的最新版本中有所缓解,包括“开发”分支。这实现了对会话轮换的 isAjax 检查,但并不能真正解决根本问题。

【讨论】:

    【解决方案3】:

    你确定会话被破坏了吗?我认为它只是没有按预期更新,它会在每个页面请求上创建一个新的。 (常见的Codeigniter设置问题)

    这是我的建议:

    仔细检查您的 Application/Config/config.php 文件,以确保如果您将站点托管在主目录中,会话域的部分看起来像这样:

    $config['cookie_prefix']    = "";
    $config['cookie_domain']    = "yourdomain.com";
    $config['cookie_path']  = "var/sessions/";
    $config['cookie_secure']    = FALSE;
    

    如果您将网站托管在子目录中,类似这样:

    $config['cookie_prefix']    = "";
    $config['cookie_domain']    = "yourdomain.com";
    $config['cookie_path']  = "siteSubDirectory/var/sessions/";
    $config['cookie_secure']    = FALSE;
    

    并且通过将它们的权限固定为755左右来确保这2个目录是可写的,我强烈建议您启用数据库会话,它更安全并且可以通过检查会话表来帮助您找出真正的问题。祝你好运:)

    【讨论】:

      【解决方案4】:

      我将为这个问题添加一个解决方法。 如果进行了 ajax 调用,则不要更新会话 通过将此文件添加到库文件夹来扩展会话类:

          class MY_Session extends CI_Session {
      
          // --------------------------------------------------------------------
      
          /**
           * sess_update()
           *
           * @access    public
           * @return    void
           */
          public function sess_update()
          {
              $CI =& get_instance();
      
              if ( ! $CI->input->is_ajax_request())
              {
                  parent::sess_update();
              }
          }
      
      }
      

      【讨论】:

        【解决方案5】:

        只需将 ci_sessions 表编码更改为 MyISAM: ALTER TABLEci_sessionsENGINE = MyISAM;

        【讨论】:

        • 这就是我需要的,你知道为什么不适合 InnoDB 吗?谢谢!
        【解决方案6】:

        config.php

        中删除波纹管
        $config['cookie_path']      = '/';
        

        【讨论】:

          【解决方案7】:

          您可能需要在 ,/application/config/config.php 中设置 cookie 域

            PHP Code:
              $config['cookie_prefix']   = '';
              $config['cookie_domain']   = '.domainname.com';
              $config['cookie_path']     = '/';
              $config['cookie_secure']   = FALSE;
              $config['cookie_httponly'] = FALSE;
          

          cookie_domain 作为你的主机名,这解决了我的会话过期问题

          【讨论】:

            猜你喜欢
            • 2011-10-17
            • 2019-12-05
            • 1970-01-01
            • 2012-08-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-04
            • 1970-01-01
            相关资源
            最近更新 更多