如何在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中关闭浏览器来销毁会话的主要内容,如果未能解决你的问题,请参考以下文章
即使在 Flask 中关闭浏览器后,如何将一个会话变量存储一段时间?
如何在 Spring Security 中关闭 HTTP 会话超时?