如何在codeigniter中关闭浏览器来销毁会话

Posted

技术标签:

【中文标题】如何在codeigniter中关闭浏览器来销毁会话【英文标题】:How to destroy session with browser closing in 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,它成功了。 【参考方案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;

换行的结果是:

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

【讨论】:

以上是关于如何在codeigniter中关闭浏览器来销毁会话的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中关闭浏览器上的会话

即使在 Flask 中关闭浏览器后,如何将一个会话变量存储一段时间?

如何在 Spring Security 中关闭 HTTP 会话超时?

如何在 symfony 2/3 中关闭会话?

Chrome 和 Internet Explorer 中的 Codeigniter 销毁会话

在 Facebook-Ios-Sdk 中关闭 Facebook 会话