2011-11-06 59 views
1

對於項目我使用HTML::MasonApache2 mod_perl2,我不確定什麼是輕鬆管理會話狀態的好方法。使用html :: mason管理會話狀態

請不要說使用催化劑。我通常會這樣做,但這次不行。

+0

怎麼樣使用舞者? :) – ysth

回答

0

看起來像我已經找到了答案

MasonX::Request::WithApacheSession 
2

與此掙扎了很長一段時間我終於有了一個可行的解決方案後:

這是用mysql存儲會話數據,因此沒有無論您打哪個前端服務器,您都會獲得相同的會話數據。

你需要用這個做了一個表稱爲會話分貝:

CREATE TABLE sessions (id char(32), length int, a_session text); 

這是MySession.pm我INC路徑。

package MySession; 

use DBI(); 
use Apache::Session::MySQL; 
use Apache2::Cookie; 

sub start_session($){ 
    my ($r) = @_; 

    my $cookie_name = 'mysite-session'; 
    my $cookie_domain = '.mysite.com'; 

    my $dsn = "DBI:mysql:database=db;host=host.com"; 
    my $dbuser = 'admin'; 
    my $dbpass = 'password'; 


    my $dbh = DBI->connect($dsn, $dbuser, $dbpass, {'RaiseError' => 1}); 

    my $session_cookie = Apache2::Cookie->fetch($r)->{$cookie_name}; 

    my %cookie_hash; 
    if(defined($session_cookie)){ 
    %cookie_hash = $session_cookie->value(); 
    } 

    tie my %session, 'Apache::Session::MySQL', $cookie_hash{SessionID}, { 
    Handle  => $dbh, 
    LockHandle => $dbh 
    }; 

    my $cookie = Apache2::Cookie->new($r, 
    -name => $cookie_name, 
    -domain => $cookie_domain, 
    -value => {SessionID => $session{_session_id}} 
); 

    $cookie->bake($r); 

    return \%session; 
} 

1; 

然後你想使用/修改會話數據的任何頁面上:

% use MySession; 
% my $session = MySession::start_session($r); 
% $session->{variable} = "Wow, I have a cookie";