【问题标题】:Mojolicious custom sessionsMojolicious 自定义会话
【发布时间】:2012-01-05 14:05:53
【问题描述】:

我正在尝试使用 Mojolicious 的数据库会话,而不是使用签名 cookie 的内置会话。

startup 子程序中我有类似的东西:

my $dbh = DBI->connect(                                                                                                                                  
                        $config->{database}->{dsn},                                                                                                      
                        $config->{database}->{user},                                                                                                     
                        $config->{database}->{password},
                      );

my $session = MojoX::Session->new(
    store     => [dbi => {dbh => $dbh}],  # use MojoX::Session::Store::Dbi
    transport => 'cookie',                # this is by default
    ip_match  => 1
);

(ref($self))->attr( 'session' => sub {                
                return $session;
                } );

我想在控制器中使用像$self->session$self->app->session 这样的会话对象。

不幸的是,它不起作用 - 它使用以前的会话(来自不同的浏览器)。

这让我发疯 - 我今天所做的只是让这项工作正常进行 - 我已经阅读了所有可用的文档,还阅读了 MojoX::Session 及其所有相关类的来源,尝试了大约 923847293847239847 种使其工作的方法,但似乎什么也没做。

PS:我在数据库中创建了session 表。

您知道我应该怎么做才能在 Mojolicious 中使用 DB 会话吗?

【问题讨论】:

    标签: perl dbi mojolicious


    【解决方案1】:

    您可以将MojoX::Session 作为startup 函数中的插件连接到应用程序。

    use Mojolicious::Plugin::Session;
    
    [...]
    
    sub startup {
      my $self = shift;
    
      [...]
    
      $self->plugin( session => {
        stash_key => 'mojox-session',
        store     => [dbi => {dbh => $dbh}],  # use MojoX::Session::Store::Dbi
        transport => 'cookie',
        ip_match  => 1
      });
    
      [...]
    

    之后,您将可以通过控制器中的存储密钥“mojox-session”访问会话。

    例如:

    $self->stash('mojox-session')->data('something');
    

    【讨论】:

    • 我如何访问控制器以外的其他文件中的会话。谢谢!
    【解决方案2】:

    您可以使用任何您喜欢的会话后端。只需创建您自己的从 Mojolicious::Controller 派生的控制器基类并覆盖 session(),如下所示:

    package NiceController;
    use Mojo::Base 'Mojolicious::Controller';
    sub session { # custom code here }
    1;
    

    然后在 startup() 中,将你的控制器类设置为默认值:

    $self->controller_class('NiceController');
    

    最后,确保您的应用程序控制器继承自 NiceController 而不是 Mojolicious::Controller

    让覆盖的 session() 函数像内置函数一样工作可能是个好主意,以避免将来混淆。

    -xyz

    【讨论】:

      【解决方案3】:

      $app->session 方法保留用于使用内置会话。

      你应该看看Mojolicious helpers,你可能想使用不同的方法名来避免冲突。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        • 2017-04-22
        • 1970-01-01
        相关资源
        最近更新 更多