【问题标题】:how to keep the session active even i opened in multiple tabs in same browser即使我在同一个浏览器的多个选项卡中打开,如何保持会话处于活动状态
【发布时间】:2014-05-20 08:46:11
【问题描述】:

我想实现一件事。我在多个标签中打开了我的网站。当我在一个标签中工作时,其他标签不应该超时。它应该是活着的。如何为其他标签保持活力。我用下面的js查找空闲时间注销。

<script type="text/javascript">
idleTime = 0;
$(document).ready(function () {

    //Increment the idle time counter every minute.
    var idleInterval = setInterval("timerIncrement()", 60000); // 1 minute

    //Zero the idle timer on mouse movement.
    $(this).mousemove(function (e) {
        idleTime = 0;
    });
    $(this).keypress(function (e) {
        idleTime = 0;
    });
})

function timerIncrement() {
    idleTime = idleTime + 1;
    if (idleTime > 2) { // 30 minutes

        var beforeTime = new Date()
        var bminutes = beforeTime.getMinutes();
        var bseconds = beforeTime.getSeconds(); 
        var user='<?php echo Auth::getSessionUserFullName();?>';
        if(user!='')
        {
            var timehours=beforeTime.getHours();
            var timeoutmin=bminutes+1;
            var timeoutseconds=bseconds-1;
            if(timeoutseconds>59)
            {
                timeoutseconds=0;
                timeoutmin=timeoutmin+1;
            }
            if(timeoutmin>59)
            {
                timeoutmin=0;
                timehours=hours+1;

            }
            if(timehours>24)
            {
                timehours=0;
            }
          var ok=confirm("Your session  expire time started at "+beforeTime.getHours()+":"+beforeTime.getMinutes()+":"+beforeTime.getSeconds()+".Please click 'OK' before "+timehours+":"+timeoutmin+":"+timeoutseconds+" to stay signed in.");
        if(ok)
        {
            var currentTime = new Date()
            var aminutes = currentTime.getMinutes();
            var aseconds = currentTime.getSeconds();
            var time=aminutes-bminutes;
            if(aminutes>bminutes && aseconds>bseconds)
            {
                alert('Time out!!Please login again to access.');
                window.location.href='<? echo APPLICATION_WEBROOT?>auth/logout';
                return false;
            }
            else if(time>=2)
            {
                alert('Time out!!Please login again to access.');
                window.location.href='<? echo APPLICATION_WEBROOT?>auth/logout';
                return false;
            }
            else 
            {
                return true;
            }

        }
        else 
        {
            window.location.href='<? echo APPLICATION_WEBROOT?>auth/logout';
        }
        }
    }

}
</script>

请帮助我。如何为所有打开的标签保留会话。提前感谢

【问题讨论】:

  • 如果你实现这样的超时(这本身就是一个有问题的选择),那么你根本就不能。浏览器选项卡不知道其他浏览器选项卡。
  • 好的。我如何在删除 js 时实现。

标签: javascript php session


【解决方案1】:

会话不是特定于选项卡的。它适用于整个浏览器实例。

当用户向服务器发出请求时,会话会被延长。因此,根据您的应用程序,您可能必须向服务器生成定期请求以扩展该会话。

为此,您可以使用 setInterval javascript 函数来触发对 PHP 后端的 AJAX 调用。

希望对您有所帮助...

顺便说一句:要小心,因为某些浏览器确实会停用没有用户焦点的选项卡(例如 Chrome) - 它不会修改会话...但某些 JS 可能会被暂停。

【讨论】:

  • 实际上会话通常被实现为在从客户端到服务器的每个请求中发送的Cookie。然后服务器用一个新的 Cookie 和一个新的过期日期来回答。当过期日期过去时,不会发送 Cookie,因此关闭会话...
  • 你为什么不把会话的过期时间设置得足够大以至于不会过期并且不需要向服务器发送ajax请求来更新会话?但是发送请求会导致负载服务器端,我认为更好的解决方案是将超时时间延长到合理的范围内。
  • @ArdiGoxhaj 好吧,每 5 分钟向服务器发送一次请求不会使您的服务器过载(尤其是因为您调用的操作不应该占用 CPU 资源)。较长的超时时间可能会解决简单页面的问题,但对于 Web 应用程序来说还不够。当用户因为会话过期而丢失工作时会非常恼火(您是否已经丢失了您在网络邮件上编写的电子邮件,您感觉如何?)。
  • 只要为每个请求创建一个新线程,执行请求就会加载服务器。为什么它对于 Web 应用程序来说还不够?每次连接到服务器时都扩展会话,我认为这是最好的方法,而不是发送请求...
  • 好吧,这个“将为每个请求创建一个新线程”是不正确的,对于某些服务器可能是正确的,但大多数只是重用线程池,甚至有些正在处理请求,例如事件(Nginx、Node.js、基于 Netty)。并且一些 Web 应用程序可能不会自然地向服务器发出请求。例如,如果您玩用 JS 编写的游戏,在 wiki 上写一篇文章等。我只是在谈论延长会话的可行解决方案。不是最终会崩溃的解决方案。
【解决方案2】:

我能想到的一种方法是自己在服务器中处理会话。

这是一个可行的系统(欢迎提出改进建议):

1) 将您自己的自定义会话存储在服务器数据库中,IP 是唯一标识符。

2) 每当用户与您的服务器交互时,获取其 IP 并更新存储在服务器中的相应会话。如果该会话已经超时,将用户重定向到超时页面。

可能有很多事情我还没有完成,但在我看来,这应该是跨标签保持会话的可行方式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    相关资源
    最近更新 更多