Управление состоянием сеанса с помощью html::mason

Я использую HTML::Mason с Apache2 mod_perl2 для проекта и не уверен, что это хороший способ легко управлять состоянием сеанса.

Пожалуйста, не говорите использовать Catalyst. Я обычно делаю, но не в этом случае.


person dalton    schedule 06.11.2011    source источник
comment
как насчет использования танцора? :)   -  person ysth    schedule 25.11.2013


Ответы (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";
person jpgunter    schedule 27.11.2012

Похоже, я нашел ответ в

MasonX::Request::WithApacheSession
person dalton    schedule 06.11.2011