首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Plack::中间件::与Starman的会话?

如何使用Plack::中间件::与Starman的会话?
EN

Stack Overflow用户
提问于 2015-03-19 15:08:31
回答 2查看 524关注 0票数 2

我有一台星际服务器-

代码语言:javascript
复制
#!/usr/bin/perl
use strict;
use warnings;
use Data::Printer;
use Plack::Builder;

my $app = sub {
    my $env = shift;
    my $session = $env->{'psgix.session'};

    # Print environment variables
    p($env);

    return [
        200,
        [ 'Content-Type' => 'text/plain' ],
        [ "Hello, you've been here for ", $session->{counter}++, "th   time!" ],
    ];
};

my $default = sub {
    my $env = shift;
    p($env);
    return [
        '200', [ 'Content-Type' => 'text/html' ],
        ["Welcome to default page"],
    ];
};

builder {
    mount "/validate" => builder {
        enable "Middleware::Authentication"
        enable "Session";
        $app;
    };
    mount "/" => builder { $default };
};

我自己的中间件“身份验证”对会话管理的用户进行身份验证并返回会话信息(过期时间、会话密钥等),那么如何在会话中间件中使用这些信息呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-19 20:33:07

如果我理解得对,您的问题只是在中间件的顺序上。在Session之前启用Auth

检查以下内容,使用文件存储,会话将持久存储。尝试一下,重新启动您的Starman,计数器将被重新加载。(我使用内联中间件作为Authentication的替代品。)

代码语言:javascript
复制
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Printer;
use Plack::Builder;

my $app = sub {
    my $env = shift;
    my $session = $env->{'psgix.session'};
    return [
        200,
        [ 'Content-Type' => 'text/html' ],
        [
            "My app page is visited ",
            $session->{counter}++,
            "th times! Validation is done at:",
            $session->{mwaretime},
            q{<br><a href="/validate">go validate again</a> --- <a href="/">reload this page</a>}
        ],
    ];
};

my $validate = sub {
    my $env = shift;
    my $session = $env->{'psgix.session'};
    $session->{counter} = 0;
    return [
        '200', [ 'Content-Type' => 'text/html' ],
        [
            "Resetting the counter:",
            $session->{counter},
             ". Time from middleware: ",
            $session->{mwaretime},
            q{<br> <a href="/validate">reload this page</a> --- <a href="/">go to index</a> }
        ],
    ];
};

builder {
    #the session will be stored persistently
    #enable the Session BEFORE your middleware
    enable 'Session', store => 'File';

    mount "/validate" => builder {
        #enable "Authentication";
        #following is same as an middleware
        enable sub {
            my $app = shift;
            return sub {
                my $env = shift;
                my $session = $env->{'psgix.session'};
                $session->{mwaretime} = time();
                $app->($env);
            };
        };
        #end of the middleware
        $validate;
    };
    mount "/" => $app 
};
票数 2
EN

Stack Overflow用户

发布于 2015-03-24 11:23:16

从您的问题中,很难确切地知道您的需求是什么样子的。但是,如果您想要对会话管理进行如此多的控制,最好编写自己的中间件。尽管如此,有一些方法可以使Plack::Middleware::Session适应某些场景。但它们中的大多数或多或少都使用了一些无文档的特性。这意味着您必须熟悉源代码,并且这些特性可能会在以后的版本中被更改或消失。

如果要提供自己的会话密钥,可以将自定义SID生成器和验证器传递给Plack::Session::State

代码语言:javascript
复制
enable 'Session',
    state => Plack::Session::State->new(
        sid_generator => $my_generator,
        sid_validator => $my_validator,
    );

文档 of sid_generator基本上是说“只读源”。

您还可以实现自己的Plack::Session::Store后端。但在这种情况下,切换到自定义解决方案可能更有意义。

关于cookie过期时间,可以在创建新cookie之前在$env->{'psgix.session.options'}中设置$env->{'psgix.session.options'}选项:

代码语言:javascript
复制
$env->{'psgix.session.options'}{expires} = $my_expires;

这不是超时,而是自UNIX时代或Cookie::Baker接受的任何值以来的秒时间。

也许您应该重新考虑您的身份验证中间件是否真的必须生成会话密钥。正如@ you 666所述,通常在身份验证之前运行会话中间件。然后,您的身份验证代码可以访问所有会话信息。会话ID通常是会话管理的实现细节,不需要涉及代码的其他部分。若要更改过期时间,请参阅我对这个问题的回答

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29148214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档