如何在浏览器多个选项卡中处理用户注销?
Posted
技术标签:
【中文标题】如何在浏览器多个选项卡中处理用户注销?【英文标题】:How to handle the user logout in browser multiple tab? 【发布时间】:2014-03-08 16:41:32 【问题描述】:我正在使用 codeigniter 会话来存储用户登录信息。当用户在多个选项卡中打开时,在一个选项卡中注销时,我希望在用户访问另一个选项卡时自动刷新页面。这可能吗?
【问题讨论】:
您需要使用 javascript 持续监控 cookie 或本地存储对象的更改并采取相应措施。 你能举个例子解释一下吗?我不知道本地存储(javascript) 【参考方案1】:刚刚对其进行了测试,我能看到的最简单的方法(至少在 Chrome 中似乎可以工作,但可能需要进一步测试)是设置 cookie。
注销时执行setcookie('loggedout',1)
之类的操作。您还需要在登录时执行相反的操作 - unset($_COOKIE['loggedout'])
那么你只需要一些简单的 Javascript...
function readCookie(name)
var nameEQ = escape(name) + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++)
var c = ca[i];
while (c.charAt(0) === ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) === 0) return unescape(c.substring(nameEQ.length, c.length));
return null;
window.setInterval(function()
if(readCookie('loggedout')==1)
window.location.assign('loggedout.html')
//Or whatever else you want!
,1000)
它会每秒检查一下是否设置了 cookie。魔法。
【讨论】:
我会试试这个并回复你。 它会通知其他标签的注销/登录事件吗?【参考方案2】:这是我解决问题的以下代码。我在登录时设置cookie并在注销时删除。在注销和登录时反之亦然。
脚本:
function readCookie(name)
var nameEQ = escape(name) + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++)
var c = ca[i];
while (c.charAt(0) === ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) === 0) return unescape(c.substring(nameEQ.length, c.length));
return null;
function setCookie(cname,cvalue,exdays)
var d = new Date();
d.setTime(d.getTime()+(exdays*24*60*60*1000));
var expires = "expires="+d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires;
window.setInterval(function()
if(readCookie('loggedout')==1)
window.location.reload();
setCookie('loggedout',2,3);
//Or whatever else you want!
else if(readCookie('loggedin')==1)
window.location.reload();
setCookie('loggedin',2,3);
//Or whatever else you want!
,2000)
控制器:
登录:
$this->load->helper('cookie');
$cookie = array(
'name' => 'loggedin',
'value' => '1',
'expire' => '86500'
);
set_cookie($cookie);
$domain= preg_replace("/^[\w]2,6:\/\/([\w\d\.\-]+).*$/","$1", $this->config->slash_item('base_url'));
$path = explode($domain,base_url());
delete_cookie('loggedout');
delete_cookie('loggedout',$domain, $path[1] );
退出:
$cookie = array(
'name' => 'loggedout',
'value' => '1',
'expire' => '86500'
);
set_cookie($cookie);
$domain= preg_replace("/^[\w]2,6:\/\/([\w\d\.\-]+).*$/","$1", $this->config- >slash_item('base_url'));
$path = explode($domain,base_url());
delete_cookie('loggedin');
delete_cookie('loggedin','localhost', '/<!-- Your path -->/');
delete_cookie('loggedin',$domain, $path[1] );
【讨论】:
以上是关于如何在浏览器多个选项卡中处理用户注销?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Rails 中处理带有陈旧 CSRF 真实性令牌的页面