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で延長する分には問題ないかと思われます。

              

              

トラックバック(0)

トラックバックURL: http://mt.hide-k.net/mt-tb.cgi/505

コメントする

プロフィール

このブログ記事について

このページは、hideが2006年8月12日 01:44に書いたブログ記事です。

ひとつ前のブログ記事は「原点回帰」です。

次のブログ記事は「2006 第17節: 浦和レッズ - FC東京」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。