做一点 RTFS,Session.pm
覆盖 Catalyst 的finalize_headers
方法并通过一个相当深的调用链在那里设置 cookie:
finalize_header
⇒ _save_session_expires
⇒ session_expires
⇒ _extended_session_expires
⇒ extend_session_id (…::Session::State::Cookie)
⇒ update_session_cookie (…::Session::State::Cookie)
似乎没有任何方法可以标记链中的任何内容以停止。唯一的检查是Cookie.pm
调用
的方法,cookie_is_rejecting
它只是将配置的 cookie 路径与请求路径进行比较。
因此,看起来最好的方法是将我自己的覆盖添加到update_session_cookie
or 或cookie_is_rejecting
. 我想我会用cookie_is_rejecting
.
这是我最终使用的代码。请注意,这相当笨拙,但它确实有效......
package Catalyst::Plugin::Session::State::Cookie::Sanity;
use base qw/Catalyst::Plugin::Session::State::Cookie/;
use MRO::Compat;
use strict;
sub cookie_is_rejecting {
my ($c, $cookie) = @_;
($c->stash->{cache_control_time} // 0) > 0
or $c->maybe::next::method( $c, $cookie );
}
1;