Perl   发布时间:2022-04-07  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了perl – 如何设置由Plack :: Middleware :: Session管理的cookie的到期时间?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
现在我的app.psgi包含(简化):
builder {
      enable 'Session',store => 'File'; #default uses Plack::Session::State::Cookie
      $app;
};

后来,在我正在使用的$app中:

@H_723_2@my $req = Plack::request->new($env); my $session = $req->session(); #returns env->{'psgix.session'} $session->{user} = "name";

它工作正常,例如:

>当用户登录时,我将他的名字存储在服​​务器端存储的会话文件中,而Plack::Middleware::Session设置了一个简单的会话状态cookie,
>当用户关闭浏览器时,cookie会自动清除(因为Plack::Session::State::Cookie默认情况下没有为cookie设置任何过期).

现在,我希望在登录面板中实现“记住我”功能.在这种情况下,不应从浏览器中自动删除sesion-state-cookie.这可以通过使Plack::Session::State::Cookie的expires方法来完成.

问题是:

如何从我的$app更改cookie过期(由Session中间件管理).换句话说,如何在这里调用expire方法:

@H_723_2@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

如果有人需要,这是一个有效的例子.

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; 
};

解决方法

您不能直接更改到期日期,但可以强制会话中间件创建一个新的会话,其新的到期日期如下:
$env->{'psgix.session.options'}{Change_iD} = 1;
$env->{'psgix.session.options'}{expires}   = $my_expires;

如果用户登录,您应该将ID更改为prevent session fixation attacks.有关支持的到期日期格式,请参阅Cookie::Baker.

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

builder {
    enable 'Session',state => Plack::Session::State->new(
            expires => $timeout_in_seconds,);
    $app;
};

大佬总结

以上是大佬教程为你收集整理的perl – 如何设置由Plack :: Middleware :: Session管理的cookie的到期时间?全部内容,希望文章能够帮你解决perl – 如何设置由Plack :: Middleware :: Session管理的cookie的到期时间?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。