\»\���\·\���\���

Catalyst������\��쏢�¼\���\���\��\���\���µ����½������¼���������

���⏪����µ­���³���³���«����������

vkgtaro���µ�����я�����\³\���\���\�����������µ��𡯏����������������ď�����������������URL������»²¹��������� MyApp::Plugin::Session.pm ������������¹��Џ�����½��������ӏ�����½������µ���·���������·�����ď�¡����������̏����������Ï�𡭏������������������¹���쏢�쏢���������������Ï��«��¡�MyApp::Plugin::Session.pm ������ hidek ���µ�����я�����\³���¼\������̏��������²���������·���¹�����������¡�돪�½��쏪���쏢���������叢���䏩��ޏ��������������������������������·���������������������·�����ď��������
�񡯡돫������ԏ�����¹¹���·���������·������(09/06/08)

coderepos ����������ޏ����������������Ï����� plugin ���̏������������� http://coderepos.org/share/browser/lang/perl/Catalyst-Plugin-Session-DynamicExpiry-Cookie/trunk

���⏪����µ­���³���³����������������

�����������䏢¡�Catalyst��������돫�����������Web\��\��\���\�ޏ��¼\·\���\��я�������¡�\��쏢�¼\���\���\��\���\���µ����½����¼���²��я��«������\���\��\���\��я�����¾�����¢̏��¹��������¡��������«������\���\��\���\���\���\���\���\¹����������¼��������؏��¹����������̏���ߏ��̏����������������·�����ď�¡�����������¡�돪�²¼������\µ\���\���������»²¹���������¼��������؏��·�����������Ώ��������·�����ď�¡�

Catalyst ������\��쏢�¼\���\���\��\���\��я�����\���\���\���\�������ҏ��������������������������������­�����⏢���� Cookie �����Ң���Ï��������µ���»������
C::P::Session::DynamicExpiry������»���������������remember me

»������������������³��������������¡�
1. \��쏢�¼\���\���\��\���\��я��̏��µ�����⏢����¾���¹�����¡�\���\���\���\�������ҏ����������������ď�����\���\��\���\���¾��؏����ӏ���������Џ���\»\���\·\���\��я�����30����̏���
2. \��쏢�¼\���\���\��\���\��я��̏��­�����⏢����¾���¹�����¡�\���\���\���\�������ҏ�����������������������\���\��\���\���¾��؏����ӡ돪�»�����\»\���\·\���\��я�����2½µ����ӏ���

���³������µ����½������ Catalyst::Plugin::Session::DynamicExpiry ������»���������������¼������½½Ð�����������������������Ï��������¹��������¡�

���½���������½������ Catalyst::Plugin::Session::State::Cookie �����ҏ����̏����Џ��¹������¾���¹�����¡�expires������������2¼������������������������¹��¡�session ������ expires ��������¡�cookie ������ expires ���������¹��¡���²��я����� session cookie����\���\���\���\�������ҏ��������������������������������������Ώ��­�����⏢����cookie �������������·�����ď��«�����������ď�����������¡�cookie_expires ������ 0 ���������·���������·�����ď�¡�YAML������½��Џ��������������³�����я������������������������������������������¹��¡�

session:
  expires: 1800 # »������������·���������«������������¾���¹��������� 7200
  cookie_expires: 0 # »������������·���������«������������¾���¹��������� expires ��������������»���������������������

cookie ������ expire s������ 0 ����\���\���\���\�������ҏ�����������������������������������¡�session ������ expires ������30����̏��������¹��¡�\���\���\���\�������ҏ��������������������«������³«���­�����������쏢�¹��������¡�cookie ����������������\»\���\·\���\���ID���̏����Џ����������������ď�������¡��·�����ď�����\»\���\·\���\��я���³«»������µ���������������¹��¡�

��������������¡��³���³���«�����������������������������������䏪��������(*Ž\��Ï��Ž\)\���

�����������돢¡�\��쏢�¼\���\���\��\���\��я�����\���\��\���\���\���\���\���\¹����\���\��\���\������µ�����������ď��������­��¡�session_time_to_live \���\½\���\��������ҏ����������я����������²���������¹��¡�������������������������¡�session ������expires ������ 1800 ���������·�����ď��̏�¡�session_time_to_live \���\½\���\��������¡돫⏢ď�ԏ�����������������������¼«���³������������¹¹²������½���������¹��¡�

sub login : Local {
    my ($self, $c) = @_;   

    if ( $c->authenticate($userinfo) ) {

        if ( $c->req->param('remember_me') ) {
            $c->session->{autologin} = 1;
            $c->session_time_to_live( 60 * 60 * 24 * 14 ); # 2½µ�����
        }
        
        # ..snip..
    }
}

\���\��\��\���\����������������­��������������¡�session_time_to_live \���\½\���\��������� undef �����ҏ��������·���������¹��¡��³��������������¡�Catalyst::Plugin::Session::DynamicExpiry ��������¡��³���������������Ï�����¼��������؏����������������������������������������ď��������������¹��¡�if¾���·������������������������Џ����������������������������Ï��������·�����������²���������ޏ��������Ð���������ޏ��������»�����я�¡������á�����Ï���

sub logout : Local {
    my ($self, $c) = @_;

    $c->logout();

    if ( $c->session->{autologin} ) {
        $c->session_time_to_live(undef);
        delete $c->session->{autologin};
        delete $c->session->{cookie_expires};
    }

    $c->res->redirect( $c->uri_for('/') );
}

Catalyst::Plugin::Session::DynamicExpiry.pm
sub calculate_extended_session_expires {
    my $c = shift;

    if ( defined(my $ttl = $c->session_time_to_live) ) {
        $c->log->debug("Overridden time to live: $ttl") if $c->debug;
        return time() + $ttl;
    }

    return $c->NEXT::calculate_extended_session_expires( @_ );
}

�����ď�������¡��³���������������������������� cookie ������ expires ������ 0 �������������������������¹��¡�session ������2½µ����ӏ����� expires ������»����������������������������¹���̏�¡�\���\���\���\�������ҏ��������������������·�����������������ď�����·�����������·�����ď�����\»\���\·\���\��я��������������������������·���������������������¹��¡�¡��½���³��������¡�cookie ������ expires ������¼«��돫�����\��\���\��\���\��я�����������¹¹²������½���������·���������¹��¡�
�񡯡돪�����돢��������������������������¡�\��\���\»\¹������������ cookie ������ expires ���̏��­�����я��������·�����������Ï�����������¡�\»\­\���\���\���\�򏪩��쏢�����������������������������«������»�ߏ�������¡�½���²��я��������� cookie ������ expires ���̏����Ώ��������µ����������������2½µ����ӏ��������������������Ï�����������¹¹���·���������·������

MyApp::Plugin::Session.pm
package MyApp::Plugin::Session;

use strict;
use warnings;
use parent 'Catalyst::Plugin::Session::DynamicExpiry';

sub calculate_session_cookie_expires {
    my $c = shift;

    if ( defined (my $ttl = $c->session_time_to_live) ) {
        $c->log->debug("Overridden session cookie time to live: $ttl") if $c->debug;
        $c->session->{cookie_expires} ||= ( time() + $ttl );
        return $c->session->{cookie_expires};
    }

    return $c->NEXT::calculate_session_cookie_expires(@_);
}

1;

�����������������Ώ�����������������¹��Џ�����½��������ӏ��������³�����я�����������������������¡�
use Catalyst qw/
    +MyApp::Plugin::Session
    Session
    Session::Store::DBIC
    Session::State::Cookie
/;

Catalyst::Plugin::Session::State::Cookie ������������������������������ ¼«��돫�����\��\���\��\���\��я����ҏ�����¹��Џ�����������������¡�calculate_session_cookie_expires \���\½\���\������̏��������Ð�����������ď��������­��������������¡�MyApp::Plugin::Session ������������������»������������������������¹��¡��³��������������¡�cookie ������ expires ���� session ����������ޏ����������������Ï�����������¹¹���µ���������������¹��������¡�

���³���������������µ»��ӏ�¡��³������»��������������ҏ����Џ����ď��¹���³����������½Ð���������������·�����ď�¡�.Ž���Ž���+.(Ž\���Ž\)Ž���+.Ž���

1. \��쏢�¼\���\���\��\���\��я��̏��µ�����⏢����¾���¹�����¡�\���\���\���\�������ҏ����������������ď�����\���\��\���\���¾��؏����ӏ���������Џ���\»\���\·\���\��я�����30����̏���
2. \��쏢�¼\���\���\��\���\��я��̏��­�����⏢����¾���¹�����¡�\���\���\���\�������ҏ�����������������������\���\��\���\���¾��؏����ӡ돪�»�����\»\���\·\���\��я�����2½µ����ӏ���

Catalyst::Plugin::Session::State::URI������������������������

Catalyst������\»\���\·\���\��ѡ�����������¹������¾���¹�����¡�\»\���\·\���\��я����¡�·������������Catalyst::Plugin::Session::State::URI���������·������������Catalyst::Plugin::Session::State::Cookie������»��������Ï�����»�ߏ��������������¹��¡���²��я�������¡�Session::State::URI������rewrite\���\��\·\���\��я�����no_rewrite_if_cookie\���\��\·\���\��я���µ��������������������������ď�������������������㏢���������Ώ��������·�����ď�¡�돪�²¼��������������¡�\»\���\·\���\���ID������param���¾������SID���������·���������¹��¡�

�����������������������¡�(����Ž\��Ï��Ž\���­)

\³���¼\��������ҏ����������я�������������������������¡�finalize����������������session_rewrite_if_needed\���\½\���\��������ҏ����������я��������������¹��¡��³�������������������������������¹��������¡�

Catalyst::Plugin::Session::State::URI
sub finalize {
    my $c = shift;
    $c->session_rewrite_if_needed;
    return $c->NEXT::finalize(@_);
}

Catalyst::Plugin::Session::State::URI
sub session_rewrite_if_needed {
    my $c = shift;

    my $sid = $c->_sessionid_to_rewrite || $c->_sessionid_from_uri;

    if ( $sid and $c->session_should_rewrite ) {        ��������
����
        if ( $c->session_should_rewrite_redirect ) {          
            $c->rewrite_redirect_with_session_id($sid);        ����
        }
����
        if ( $c->session_should_rewrite_body ) {����
            $c->rewrite_body_with_session_id($sid);
        }
    }
}

9¹��ԏ����䏢�������ԏ���̏�������¡�\���\¹\���\���\¹\³���¼\�������3xx(������������������302���«����������)�����������������ď�����\���\���\���\���\���\������¹���������������­������SID=xxxxx������¼«����돪���쏢����rewrite���·��������������������������¡����������������Ï�����������

13¹��ԏ����䏢�������ԏ���̏�����content_type����������html��¡ߏ��̡�������������������������������­��¡񏪡«�돪䏪����������URL������SID=xxxxx������¼«����돪���쏢����rewrite���·��������������������������¡����������������Ï�����������

����ߏ���������$sid and $c->session_should_rewrite��������¾���·��������ҏ����Џ����ď��¹���������­��������¡�\»\���\·\���\���ID������URL������¼«����돪���쏢���������؏����ď��·��������������������������¡����������������Ï��������ޏ��������¹��¡򏪴��������̏��������������������������������¹���«����(����Ž��Ρ��Ž���)������

��������������¡�session_should_rewrite\���\½\���\��������ҏ����������������������Ώ��������¹��¡�

Catalyst::Plugin::Session::State::URI
sub session_should_rewrite {
    my $c = shift;
    return unless $c->config->{session}{rewrite};

    if ( $c->isa("Catalyst::Plugin::Session::State::Cookie")
        and $c->config->{session}{no_rewrite_if_cookie}
    ) {
        return if defined($c->get_session_cookie);
    }

    return 1;
}

rewrite����false�����������������ď�������¡�rewrite������¹��ԏ����������������������������Ï��������¹��¡�(rewrite������\���\���\���\���\���1)

Catalyst::Plugin::Session::State::Cookie
sub get_session_cookie {
    my $c = shift;
    my $cookie_name = $c->config->{session}{cookie_name};
    return $c->request->cookies->{$cookie_name};
}

���µ��������������¡�Catalyst::Plugin::Session::State::Cookie������use���·��������������������¡�no_rewrite_if_cookie\���\��\·\���\��я���true(\���\���\���\���\���1)��������¡��«��������¡�\���\���\­���¼���̏�������돩Ώ��¹������¾���¹�����¡�rewrite���·�����������������������Ï��������¹��¡�

���������������³��������������¡�rewrite\���\��\·\���\��я�����no_rewrite_if_cookie\���\��\·\���\��я������������������·�����ď��¼��¡�(,,Ž��Ρ�\Ž���)y����¡���
karaage299 at gmail.com
��돪������������µ­»���
\���\��\���\���\���\���