我有一个基于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值并维护会话状态以进行身份验证吗? (用户请求的每个页面加载都在服务器的新分支中处理。)
答案 0 :(得分: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运行twiggy
命令行工具或plackup
。
答案 1 :(得分:1)
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);