Php 我不知道';在浏览器关闭之前,我不希望会话无效

Php 我不知道';在浏览器关闭之前,我不希望会话无效,php,session,Php,Session,在客户端计算机上存储会话id没有问题,而且非常简单。问题是要将实际会话存储在服务器上,直到我真的感觉自己已经完成了 垃圾收集器非常清楚它是如何工作的。我想没有办法阻止它在一定时间内清理垃圾。我可以将该时间设置得很高,但可能会发生会话劫持(这仍然很小,劫持会话对破解程序没有更大的用处)或会话目录过度拥挤(猜测您确实需要巨大的通信量才能实现这一点,但仍然…) 使用javascript进行常规http请求以防止GC在客户端空闲时最终捕获会话的唯一解决方案是什么 提前谢谢非常感谢。您无法可靠地检测到浏览

在客户端计算机上存储会话id没有问题,而且非常简单。问题是要将实际会话存储在服务器上,直到我真的感觉自己已经完成了

垃圾收集器非常清楚它是如何工作的。我想没有办法阻止它在一定时间内清理垃圾。我可以将该时间设置得很高,但可能会发生会话劫持(这仍然很小,劫持会话对破解程序没有更大的用处)或会话目录过度拥挤(猜测您确实需要巨大的通信量才能实现这一点,但仍然…)

使用javascript进行常规http请求以防止GC在客户端空闲时最终捕获会话的唯一解决方案是什么


提前谢谢

非常感谢。您无法可靠地检测到浏览器窗口已关闭。即使JS提供了on widow close事件,您也不应该使用它,因为通过单击“close”按钮关闭浏览器只是客户端会话可能结束的几种方式之一

其他可能性:

  • 浏览器崩溃
  • 客户端的计算机崩溃
  • 网络连接死亡
  • <> Li >几个浏览器不考虑关闭窗口一个卸载事件(Opera甚至不考虑关闭一个标签或者通过在地址栏中键入一个地址卸载事件)来移动网页[差不多是的。您无法可靠地检测到浏览器窗口已关闭。即使JS提供了on widow close事件,您也不应该使用它,因为通过单击“close”按钮关闭浏览器只是客户端会话可能结束的几种方式之一

    其他可能性:

  • 浏览器崩溃
  • 客户端的计算机崩溃
  • 网络连接死亡
  • <> Li >几个浏览器不考虑关闭窗口一个卸载事件(Opera甚至不考虑关闭一个标签或者通过在地址栏中键入一个地址卸载事件)来移动网页[如果您想要永久保留会话,那么请定义一个自定义垃圾收集器


    但是,您无法真正了解用户何时关闭浏览器。最简单的方法是设置一个JavaScript或元刷新pinger,只要它们打开了你的页面,就会一直通知你,但你不知道它们还没有打开到另一个页面。

    如果你想永远保持会话,那么就定义一个自定义垃圾收集器


    但是,您无法真正了解用户何时关闭浏览器。最简单的方法是设置一个JavaScript或元刷新pinger,只要它们打开了你的页面,就会不断通知你,但你不知道它们还没有打开到另一个页面。

    我相信你可以使用XMLHTTPRequest(Ajax技术)通过简单的session_start()将服务器ping到空白页面; 比方说,每隔15分钟(默认PHP会话超时为20秒),这样它们就不会使服务器过载

    但是,如果您确实想要持久化数据,则在浏览器退出时会清除一个没有明确过期时间的cookie,这样您就可以在cookie中存储一个存储密钥。这比会话有一个优势——如果客户端的网络连接断开,会话仍在工作。但这会带来更多会话劫持的风险


    如果您正在谈论在浏览器会话中保持登录的持久性,则首选cookie方式,世界各地的许多网站都在使用cookie方式,包括Drupal、Wordpress和Joomla!CMS。

    我相信您可以使用XMLHTTPRequest(Ajax技术)通过简单的会话启动()将服务器ping到空白页面;比方说,每隔15分钟(默认PHP会话超时为20秒),这样它们就不会使服务器过载

    但是,如果您确实想要持久化数据,则在浏览器退出时会清除一个没有明确过期时间的cookie,这样您就可以在cookie中存储一个存储密钥。这比会话有一个优势——如果客户端的网络连接断开,会话仍在工作。但这会带来更多会话劫持的风险


    如果您正在谈论在浏览器会话中保持登录的持久性,则首选cookie方式,世界各地的许多网站都在使用cookie方式,包括Drupal、Wordpress和Joomla!CMS.

    有很多方法,但没有一种是可取的。我将列出我学到的东西。 注:我希望人们理解这一点。大多数人认为我只想在客户端关闭浏览器时注销。事实并非如此,我只是想释放资源,而不是20分钟的延迟。我想大多数开发者只是升级了电脑

    1) 保持从客户端脚本ping您的服务器,因此,它将保持“短会话”活动。 这显然会增加服务器的流量,而且显然不会立即注销,因为你不想像每秒钟一样ping

    2) 使用来自客户端broswer的Javascript。到目前为止,我认为它们都不起作用,即使是现有的IE代码示例,clienX也将>0。不管怎样,这是迄今为止对我有效的代码。只在IE上,因为Firefox事件现在对我不起作用。我粗略计算了关闭按钮在屏幕上的相对位置,并确定客户端是否单击了该区域。若“刷新”按钮离“关闭”按钮(x方向)太近,它会认为您单击了“关闭”按钮,但这种情况很少见

    <head runat="server">
        <title>Untitled Page</title>
    <script type="text/javascript">
        function test(event) {
            var X = window.event ? window.event.screenX : event.clientX;
    
            // IE only because event.clientX for FF = undefined (event.clientX IS the FF way).
            if (X == null) {
                alert("No X");
                return;
            }
    
            var left = window.screenLeft ? window.screenLeft : window.screenX;
            var winwidth = document.body.clientWidth ? document.body.clientWidth : window.outerWidth;
            var leftMargin = document.body.leftMargin ? parseInt(document.body.leftMargin, 10) : 0;
            var rightMargin = document.body.rightMargin ? parseInt(document.body.rightMargin, 10) : 0;
            var resultX = X - (window.screenLeft + winwidth + leftMargin + rightMargin); // scroll bar width is not calculated.
            var Y = window.event ? window.event.clientY : event.clientY;
    
            if (resultX > -25 && Y < 0)
                alert("logging out");
        };
    </script>
    
    </head>
    <body onbeforeunload="test(event);">
    
    
    无标题页
    功能测试(事件){
    var X=window.event?window.event.screenX:event.clientX;
    //IE只是因为FF的event.clientX=未定义(event.clientX是FF方式)。
    如果(X==null){
    警报(“No X”);
    返回;
    }
    var left=window.screenlight?window.screenlight:window.screenX;
    var winwidth=document.body.clientWidth?document.body.clientWidth:window.outerWidth;
    var leftMargin=document.body.leftMargin?parseInt(document.body.leftMargin,10):0;