4

我有一个Twiggy基于 perl 服务器:

my $app = sub { my $req = Plack::Request->new(shift); ... };
my $twiggy = Twiggy::Server->new(port => $port);
$twiggy->register_service($app);

它工作正常,但现在我想向它添加会话管理(以处理用户身份验证)。我看到 CPAN 上有一个Plack::Middleware::Session模块,但基于它的文档和 Twiggy,我不知道如何将两者结合使用。我有理由相信这是可能的,因为在我的 $app 中我正在处理 Plack 的东西。

除了使用Plack::Middleware::Session之外,还有其他方法可以轻松获取和设置 cookie 值并维护会话状态以进行身份​​验证吗?(用户请求的每个页面加载都在服务器的新分支中处理。)

4

2 回答 2

4

你可以把它串起来。Plack::Builder的builder功能会将您的应用程序包装在一个(或多个)中间件中。然后你只需将它作为一个新应用程序传递给 Twiggy。

use Plack::Builder;
use Twiggy::Server;

my $app = sub {
    my $env = shift;
    my $req = Plack::Request->new($env);
    my $session = $env->{'psgix.session'};
    return [
        200,
        [ 'Content-Type' => 'text/plain' ],
        [ "Hello, you've been here for ", $session->{counter}++, "th time!" ],
    ];
};

$app = builder {
    enable 'Session', store => 'File';
    $app;
};

my $twiggy = Twiggy::Server->new(port => 3000);
$twiggy->register_service($app);

AE::cv->recv;

请注意,这将返回一个新应用程序,但除非您分配它,否则builder它不会最终出现。$app您也可以像这样builder放入register_service

my $twiggy = Twiggy::Server->new(port => 3000);
$twiggy->register_service(builder {
    enable 'Session', store => 'File';
    $app;
});

或者当然你可以摆脱 Twiggy::Server 并运行twiggy命令行工具或plackup使用 twiggy。

于 2014-10-01T11:04:09.803 回答
1

PSGI 的乐趣在于每次都以相同的方式连接在一起。

build您可以使用Plack::Builder 提供的函数扩展一个带有中间件的 PSGI 应用程序。

我还没有尝试过,但我希望这样的事情会起作用:

use Twiggy::Server;
use Plack::Builder;
use Plack::Middleware::Session;

my $app = sub { my $req = Plack::Request->new(shift); ... };

$app = builder {
  enable 'Session';
  $app;
}

my $twiggy = Twiggy::Server->new(port => $port);
$twiggy->register_service($app);
于 2014-10-01T10:59:40.440 回答