Mojolicious 会话析构函数

Mojolicious session destructor

当用户的会话过期时,如何调用一些自定义操作。这可以用 mojolicious 来完成吗?可以用其他 web 框架来完成吗?

我要找的词是什么,我不知道 google,除了 "session destructor" 或 "session destroy"。

具体来说,我想通知外部 API,删除那里的会话。

由于您的问题没有得到任何答案,我决定进行一些挖掘。

我找到了 Plack::Session::Cleanup (which can be used by Plack::Middleware::Session) that seems to have what you wish. Unfortunately, here's where I ran into problems, there's a MojoX::Session::Simple for Plack::Middleware::Session::Simple,但没有用于非简单模块的连接器。所以,我不知道这是否对你有帮助,但你可以四处看看是否可以。


然后我查看了 Mojolicious::SessionsMojolicious::Sessions::StorableMojoX::SessionMojolicious::Plugin::SimpleSession 以了解它们如何处理到期...

查看 the code for Mojolicious::Sessions,似乎会话仅存储在 cookie 中,并且仅在从客户端加载回 cookie 时才检查过期。如果你在第 24 行有一个钩子来处理过期会话,它可能会为同一个过期会话调用多次(并且可能不是你想要的)或者它可能永远不会被调用(如果客户端在过期前停止访问系统) .

Mojolicious::Sessions::Storable 基于 Mojolicious::Sessions 并且似乎具有相同的到期代码(具有相同的问题)。

查看 the code for MojoX::Session,看起来 flush 有回调的规定(对于第 216 行的先前过期会话和第 227、233、262 和 268 行的新过期会话 [不幸的是,没有办法区分这两者])。 不幸的是,此功能没有记录,因此它可能随时消失,而且我不确定 when/how 它是否可以使用(再次因为没有记录)。

Mojolicious::Plugin::SimpleSession 有一个可以被覆盖的方法 (_too_old)。

我还查看了 WWW::Session::Storage::File,它经常与 WWW::Session 一起使用,可以通过 Mojolicious::Plugin::WWWSession 使用,您可以在第 112 行周围放置一个钩子 in the code,但是同样没有内置任何内容。

因此,总而言之,MojoX::Sessionflush 方法中的 undocumented 回调最接近,但所有这些解决方案都有一个致命缺陷: 只有在交易发生时才会调用它们,这意味着您会错过一些过期时间(除非您有另一种机制来处理这些过期时间)。因此,我认为最好让另一个 API 根据比您的应用程序会话更长的超时来管理其会话清理,或者为另一个 API 创建您自己的 timeout/cleanup 机制的会话存储在您的应用程序中。