gpt4 book ai didi

session - Mojolicious session 不会过期

转载 作者:行者123 更新时间:2023-12-04 15:40:06 25 4
gpt4 key购买 nike

我正在使用 mojolicious 构建一个 Web 应用程序。注销功能仅在本地计算机上运行应用程序时有效。当我尝试在服务器上运行的应用程序上注销时, session 不会过期并且我保持登录状态。

当我们将注销更改为通过 POST 请求而不是 get 完成时,这种情况就开始发生了。

我们调用注销的方式是作为来自前端的 AJAX 调用:

function do_logout() {
$.post( "<%= url_for('on_logout') %>", function() {});
}

登出路线:
$if_login->post('/logout')->name('on_logout')->to('user#on_logout');

注销 Controller :
sub on_logout {
my $self = shift;
$self->session(expires => 1);
return $self->redirect_to('home');
}

将 session 设置为过期的行被调用,但在重定向之后, session 仍然包含登录的用户名。

最佳答案

我们终于找到了错误,请求是使用

<a href="" onclick="do_logout()"></a>

这基本上是一次做两个 Action 并创造一个竞争条件。这是相关的代码片段
# Relevant routes
my $if_login = $r->under('/')->to('user#is_logged_in');
$if_login->post('/logout')->name('on_logout')->to('user#on_logout');

# Controller functions
sub on_logout {
my $self = shift;
$self->session(expires => 1);

return $self->render(json => '{success: "true"}');
}

sub is_logged_in {
my $self = shift;

say $self->session('username'); # Sometimes after on_logout this is still
# defined and equal to the username.
return 1 if($self->session('username'));

$self->render(
template => 'permission/not_logged_in',
status => 403
);
return;
}

# Front end
<a href="" onclick='do_logout();'>
<%= l('Log out') %>
</a>

<script>
function do_logout() {
$.post( "<%= url_for('on_logout') %>", function() {
}).fail(function() {
alert( "error logging out" );
}).done(function( data ) {
alert( "Data: " + data );
}).always(function() {
alert( "finished" );
});
}
</script>

感谢您的帮助!

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

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