CatalystでSessionを使うときexpireが動的に変えれないのがナニなので、Catalyst::Plugin::Session::DynamicExpiryを無理やり最近のバージョンのC::P::Sessionで使えるよう実装しなおしてMLにポストしたらYavalがC::P::Sessionを書き直してまで実装してくれました。
Catalyst::Plugin::Session::DynamicExpiry 0.02
C::P::Session 0.11以上と一緒に動作します。"remember me"なんかでお得です。
使い方はMyAppで
use Catalyst qw/
Session::Dynamic::Expiry
Session
Session::Store::FastMmap
Session::State::Cookie
/;
として
sub foo {
my ($self, $c) = @_;
...
if ($c->req->param('remeber')) {
$c->session_time_to_live( 604800 );
}
...
}
とかすればOK。
ただ、cookieと一緒に使うときにconfigでcookie_expiresを直接設定してるとcookieのexpireだけ変更されません。
C::P::Session::State::Cookieのcalculate_session_cookie_expiresをオーバーライドしちゃダメ?と提案したのですが本人がcookie_expiresの実装が気に入ってないらしくあえなく却下されました。食い下がろうと思ったのですが、英語が苦手なのでスゴスゴ引き下がった次第です。
で、ボクなりの解決策としてはC::P::Session::DynamicExpiryを継承して
sub calculate_session_cookie_expires {
my $c = shift;
if ( defined(my $ttl = $c->session_time_to_live) ) {
$c->log->debug("Overridden cookie time to live: $ttl") if $c->debug;
return time() + $ttl;
}
return $c->NEXT::calculate_session_cookie_expires( @_ );
}
でオーバーライドしたのを使えばいいかなと。
ただ、expireを延長するときはいいのですが逆の場合、例えばsession cookie(ブラウザを閉じるまでのみ有効なcookie、つまりexpires = 0)に変更したい場合はダメですね。
$c->config->{session} = {
expires => 3600,
cookie_expires => 0
}
とかしておいてsession_time_to_liveで延長する分には問題ないかと思われます。

コメントする