首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置由Plack::中间件::Session管理的cookie的过期时间?

如何设置由Plack::中间件::Session管理的cookie的过期时间?
EN

Stack Overflow用户
提问于 2015-03-21 20:09:55
回答 1查看 1K关注 0票数 8

现在,我的app.psgi包含(简化):

代码语言:javascript
复制
builder {
      enable 'Session', store => 'File'; #default uses Plack::Session::State::Cookie
      $app;
};

稍后,在我使用的$app中:

代码语言:javascript
复制
my $req = Plack::Request->new($env);
my $session = $req->session(); #returns env->{'psgix.session'}
$session->{user} = "name";

它使用ok,例如:

现在,我想在我的登录面板中实现“记住我”的功能。在这种情况下,不应该从浏览器中自动删除sesion状态cookie。这可以通过使用来自expiresPlack::Session::State::Cookie方法来完成。

问题:

如何从我的会话更改cookie过期(由$app中间件管理)。换句话说,如何在这里稍微调用致满方法:

代码语言:javascript
复制
my $req = Plack::Request->new($env);
my $session = $req->session(); #returns env->{'psgix.session'}
$session->{user} = "name";
my $cookie_state = WHAT_TO_DO_HERE_TO_GET; #the current Plack::Session::State::Cookie object
$cookie_state->expire(86400*14); #expire in two weeks

如果有人需要,下面是一个有用的例子。

代码语言:javascript
复制
use strict;
use warnings;
use Plack::Request;
use Plack::Response;
use Plack::Builder;
use Data::Dumper;

my $app = sub {
    my $env = shift;
    my $req = Plack::Request->new($env);
    my $session = $req->session;
    my $res = Plack::Response->new(200);
    $res->content_type('text/html');
    my $link = $session->{user}
            ? q{ <a href="/logout">logout</a>}
            : q{ <a href="/login">login</a>}
            ;
    $res->body(["Session user:", $session->{user}, "<br>$link"]);
    return $res->finalize;
};

my $login = sub {
    my $env = shift;
    my $req = Plack::Request->new($env);
    my $session = $req->session;

    $session->{user} = "some";
    #how to set here the session-state-cookie expiration?

    my $res = Plack::Response->new();
    $res->redirect("/", 302);
    return $res->finalize;
};

my $logout = sub {
    my $env = shift;
    my $req = Plack::Request->new($env);
    my $session = $req->session;
    delete $session->{user};
    my $res = Plack::Response->new();
    $res->redirect("/", 302);
    return $res->finalize;
};

builder {
    enable 'Session', store => 'File';
    mount "/login" => $login; 
    mount "/logout" => $logout; 
    mount "/favicon.ico" => sub { return [ 404, ['Content-Type' => 'text/html'], [ '404 Not Found' ] ] };
    mount "/" => $app; 
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-22 10:57:35

不能直接更改过期日期,但可以强制会话中间件使用新的到期日期创建一个新会话,如下所示:

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

如果用户登录,则应该将ID更改为防止会话固定攻击。有关受支持的过期日期格式,请参见Cookie::Baker

编辑:如果要全局设置默认过期超时,可以手动构建状态对象并将expires参数传递给构造函数:

代码语言:javascript
复制
builder {
    enable 'Session',
        state => Plack::Session::State->new(
            expires => $timeout_in_seconds,
        );
    $app;
};
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29187503

复制
相关文章

相似问题

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