php Laravel多租户会话

thigvfpy  于 2023-08-02  发布在  PHP
关注(0)|答案(2)|浏览(177)

在我的Laravel应用程序中,我设置了登录会话设置并设置了
第一个月
config/session.php文件中,这样,如果用户关闭浏览器,他的会话结束,我还记录了用户最后一次登录的时间在我的表中如何知道会话结束,或者当用户关闭浏览器或忘记打开浏览器,并且在config/session.php文件的生命周期选项中指定的会话时间过期时,会话结束。
当会话关闭时,Laravel中是否存在执行的事件?以及如何使用这个事件。知道我的Laravel应用程序是手动多租户的,每个租户都有一个单独的数据库连接,我想在拥有这个用户的租户的数据库中记录用户的会话到期时间

ioekq8ef

ioekq8ef1#

不可能知道用户何时结束会话,而没有用户或用户的浏览器触发事件,例如:用户点击“注销”或一些JS钩入“窗口关闭”事件。
除此之外,它是:
1.用户端cookie到期,这可能也很可能发生在用户实际打开您的网站的范围之外。
1.会话将在服务器端过期,这也不会触发任何事件,除非您覆盖默认的会话清理行为。即便如此,这种情况发生的时间也不太可能与实际会话到期相对应,只是之后的某个任意时间。
TLDR:没有可靠的方法可以知道用户何时停止查看您的网站,也没有触发会话到期事件。
你能做的最好方法是跟踪“最后一次活动”时间,并假设在X分钟后用户不再活动。

eoxn13cs

eoxn13cs2#

在Laravel中,由于浏览器关闭(当设置'expire_on_close' => true时)或到期而导致的会话终止没有直接的事件可以听出来。会话到期本质上是客户端发生的事件;服务器并不确切地“知道”用户的浏览器何时关闭。
但是,您可以使用一些技术来估计或解决这个问题。
1.浏览器“卸载”事件:
您可以使用浏览器的beforeunload事件在用户即将离开页面时通知服务器(例如,关闭选项卡或浏览器):
JavaScript

window.addEventListener('beforeunload', function (event) {
    // Send an AJAX request to the server to inform about session end
    // Use either fetch or XMLHttpRequest or any other way you use to send AJAX
});

字符串
请记住,由于beforeunload事件的同步特性,在beforeunload事件中可以执行的操作有一定的限制,因此它通常与beacon请求或非常快速的轻量级请求一起使用。2.周期 AJAX “ping”:
另一种方法是周期性地从客户端向服务器发送 AJAX “ping”,如果服务器在很长一段时间内没有收到此ping(如2倍的预期ping间隔),则可以假设会话已结束或浏览器已关闭。此方法还用于在需要时保持会话活动。3.中间件:
您还可以使用中间件通过比较当前时间与会话的上次活动来检查会话是否过期。这不会捕获浏览器关闭的确切时刻,但它可以帮助您捕获会话超时。处理多租户会话终止:
对于多租户设置,在通知服务器会话终止时,可以发送特定于用户或租户的信息,以确保更新正确的租户数据库。
下面是一个将beforeunload事件和中间件结合起来的简单示例:
JavaScript:

window.addEventListener('beforeunload', function (event) {
    fetch('/session-end', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
            'X-Requested-With': 'XMLHttpRequest',
            'X-CSRF-TOKEN': '{{ csrf_token() }}' // Laravel CSRF token
        },
        body: JSON.stringify({
            // Here you can send any user or tenant-specific info
        })
    });
});


Laravel中间件:
php

public function handle($request, Closure $next)
{
    if ($request->path() === 'session-end') {
        // Handle your logic here to mark session end for the user/tenant.
    }

    return $next($request);
}


使用这些方法,您可以粗略估计会话终止事件。请记住,由于HTTP的无状态特性,您永远不会获得100%的准确性,但这些方法应该可以让您非常接近。

相关问题