【问题标题】:How to destroy session with browser closing in codeigniter如何在codeigniter中关闭浏览器来销毁会话
【发布时间】:2012-10-21 21:02:03
【问题描述】:

最近我用 codeigniter 开发了一个 web 应用程序。我在那里遇到了一个与会话相关的问题。

问题场景:

如果用户 A 登录到应用程序,则用户 ID 在会话中设置。完成任务后,用户 A 关闭了浏览器并离开了计算机。过了一会儿,用户 B 来打开浏览器,看到应用程序处于登录状态。或者当用户 B 写下 url 并按 enter 时,使用上一个会话直接重定向到应用程序而无需任何身份验证。

我对会话使用了以下配置:

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 1800;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie']  = FALSE;
$config['sess_use_database']    = FALSE;
$config['sess_table_name']      = 'ci_sessions';
$config['sess_match_ip']        = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update']  = 300;

现在我的问题是如何通过在 codeigniter 中关闭浏览器或浏览器选项卡来销毁所有会话?

【问题讨论】:

  • 尝试设置$config['sess_expire_on_close'] = TRUE;Sessions - 关闭浏览器窗口时是否使会话自动过期。
  • 它不起作用。还有其他解决办法吗?
  • 您是否将会话存储在数据库中?
  • @AlexRichards 不,我没有将会话存储在数据库中。
  • 对于未来的访问者:首先,我尝试了$config['sess_expiration'] = 0;,但没有成功。然后我尝试了$config['sess_expire_on_close'] = TRUE;,它成功了,但据说这是legacy setting。所以我不能真正依赖它。又试了第一个。这次我重新启动了 Apache,它成功了。

标签: php codeigniter session


【解决方案1】:

编辑config.php 文件并将sess_expire_on_close 设置为true

例如

$config['sess_expire_on_close'] = TRUE;

【讨论】:

    【解决方案2】:

    您可以使用 javascript 和异步请求。 当你关闭窗口时,window.onunload 的处理程序被调用

    var unloadHandler = function(e){
            //here ajax request to close session
      };
    window.unload = unloadHandler;
    

    解决重定向问题,php端可以使用计数器

      class someController  extends Controller {
    
       public function methodWithRedirection(){
    
            $this->session->set_userdata('isRedirection', 1);
            //here you can redirect  
       }
    }
    class homeController extends Controller{
       public function closeConnection(){
            $this->load->library('session');
            if($this->session->userdata('isRedirection')!== 1){
                //destroy session
             }
          }
       }  
    

    【讨论】:

    • 是的,这是一种解决方案,但有一个问题是页面重定向会话清除,然后应用程序消失了。
    • 所以使用计数器的php端。当计数器为 0 时,您确实会销毁会话。
    【解决方案3】:

    添加注销按钮。

    让该按钮销毁与 CI 的 built in destroy function 的会话。

    $this->session->sess_destroy();
    

    【讨论】:

    • 这是最理智的方法。然而,框架孩子们希望一切都自动完成。这就是为什么新手不应该使用框架的原因。
    【解决方案4】:

    看看这个,看看是否有帮助。

    https://github.com/EllisLab/CodeIgniter/wiki/PK-Session

    【讨论】:

      【解决方案5】:

      好吧,我不知道你是否已经有了解决方案,但我发现自己在 CodeIgniter 3.0 版中遇到了同样的情况。在config.php,转到Session Variables部分,您可以设置:

      $config['sess_expiration'] = 0;
      

      sess_expiration:您希望会话持续的秒数。如果您想要一个不会过期的会话(直到浏览器关闭),请将值设置为零:0

      【讨论】:

      • 我明白了,但是如果您希望会话在不同情况下过期怎么办?例如,在一小时内或浏览器关闭时使会话过期。你是怎么处理的?
      • 第一次用这个,不行。我不得不重新启动 Apache,然后它就可以工作了。
      【解决方案6】:

      $config.php 文件中

      change  $config['sess_expiration'] = 7200;
      

      $config['sess_expiration'] = 0;
      

      【讨论】:

        【解决方案7】:

        只需在application/config/config.php 文件中设置sess_expiration =0 如 Codeigniter documentation 中所述

        【讨论】:

          【解决方案8】:

          打开通用配置文件application/config/config.php,搜索$config['sess_expiration']

          改变

          $config['sess_expiration'] = 7200;
          

          $config['sess_expiration'] = -1;
          

          【讨论】:

            【解决方案9】:

            对于 CI-3.0.4,在“config.php”中找到以下项目并进行相应设置

            $config['sess_expiration'] = -1;
            $config['sess_time_to_update'] = -1;
            

            【讨论】:

              【解决方案10】:

              我用这种方式。这对你有帮助吗?

              改变

              $config['sess_expiration'] = 7200;
              

              以上代码的结果是:

              $config['sess_expiration'] = time() + 7200;
              

              换行的结果是:

              现在,如果您关闭浏览器窗口,会话将被自动删除。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-08-15
                • 1970-01-01
                • 1970-01-01
                • 2012-05-17
                • 1970-01-01
                相关资源
                最近更新 更多