gpt4 book ai didi

perl - session 不会在 Mojolicious 中过期

转载 作者:行者123 更新时间:2023-12-01 12:47:34 24 4
gpt4 key购买 nike

我有一个 Mojolicious 应用程序和一个用于身份验证的桥梁。这是我的场景:
我在数据库中有一组标准错误响应,我通过传入一个值来查询,比如说,返回一个带有详细错误响应的 404。数据库将具有与错误相对应的通用详细信息,而其他用户特定的详细信息(例如 ip 和用户名)是从 Controller 获取的。请看this link关于如何构建错误响应。我有一个助手,它获取 Controller 实例和错误代码以生成所需的响应。我使用 Controller 对象通过包含错误响应的表的结果集来查询数据库。通过 Controller ,我还获得了创建响应所需的用户特定详细信息。然后创建响应,将其发送回 Controller ,然后将其作为 Json 返回。
我的问题是注销时,我设置了 $self->session(expires => 1) 使 session 无效。在尝试再次注销时,我使用 Controller 访问助手构建错误响应并将其发送给客户端。现在,通过以下检查,任何访问任何 URI 的尝试对于第一次尝试都是徒劳的。

unless($self->session('user')) {
my $res = Controller::Helper->error_res($self, 403);
$self->render_json($res, status => $res->{httpstatuscode});
return;
}

此检查第一次有效,但当我再次尝试访问资源时(任意次数),此检查失败并且无需登录即可访问资源。当我查看 cookie 时,会创建一个新的 cookie。我哪里错了?处理此类问题的最佳方法是什么?辅助函数如下所示

error_res{ 
my($self,$c,$res) = @_;
my @arref = $c->db->resultset('Errorcode')->select_row($res);
my $ref=$arref[0];
$ref->{user}=$c->session->{user}->{name};
$ref->{request}=$c->req->method."".join("\\",$c->req->url->path);
$ref->{time}=scalar localtime();
return $ref;
}

res 是数据库中识别特定错误的 id。

那么,这是否与助手中仍然可用的 Controller 引用有关?当我在 helper 中取消定义 $c 时,它没有帮助。
编辑 1: 我是否遗漏了一些要点,这是正确的方法吗?
编辑 2: 我在注销时使用户无效。当用户再次尝试注销时,我会返回一个错误以及有关该错误的附加信息。但是在创建有关错误的附加信息时,会创建一个没有用户信息的新 session 。如果我执行以下操作,则不会发生这种情况

unless($self->session('user')) {
$self->render_json("message:User has not logged in", status => 403);
return;
}

最佳答案

所以我找到了答案,奇怪的行为是由于 autovivification 造成的perl 的特性。它涉及数据结构的动态创建。在我的例子中,我尝试通过

处的 session cookie 获取用户名
$ref->{user}=$c->session->{user}->{name}; 

当用户未登录时, session 中未设置 user 键,但我在创建错误响应时尝试通过此键获取 name 。这会导致创建没有值的 user。检查 user 键是否存在解决了这个问题。

关于perl - session 不会在 Mojolicious 中过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14471078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com