我有一个基于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的文档,我不知道如何将两者结合使用。我有理由相信这是可能的,因为在我的$应用程序中,我正在处理Plack的东西。
除了使用Plack::Middleware::Session
之外,是否还有其他方法可以方便地获取和设置cookie值,并维护会话状态以进行身份验证?(用户请求的每个页面加载都在服务器的新分支中处理。)
您可以将其串在一起。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运行twiggy
命令行工具或plackup
。
PSGI的乐趣在于,每次都以相同的方式将所有东西连接在一起。
使用Plack::Builder提供的build
函数,您可以使用中间件扩展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);