Mojolicious 会话不会过期
Mojolicious session does not expire
我正在使用 mojolicious 构建 Web 应用程序。注销功能仅在 运行 本地计算机上的应用程序时有效。当我尝试注销服务器上的应用程序 运行 时,会话不会过期并且我仍保持登录状态。
当我们将注销更改为通过 POST 请求而不是 get 完成时,这种情况开始发生。
我们调用注销的方式是来自前端的 AJAX 调用:
function do_logout() {
$.post( "<%= url_for('on_logout') %>", function() {});
}
登出路线:
$if_login->post('/logout')->name('on_logout')->to('user#on_logout');
注销控制器:
sub on_logout {
my $self = shift;
$self->session(expires => 1);
return $self->redirect_to('home');
}
设置会话过期的行被调用,但是在重定向之后,会话仍然包含登录的用户名。
你知道 Mojolicious::Plugin::Authentication 插件吗?这是一个很好的模块,自从我发现 Mojolicious 以来我就一直在使用它。文档指出,您需要将 'expires' 属性设置为过去才能删除会话,但此模块采用另一种方法。
$app->helper(logout => sub {
# omitted
delete $c->session->{$session_key};
});
您可能不仅要尝试设置 'expires' 属性,还要尝试 delete
-ing 会话密钥。
你说这个问题是你把localhost改成域名后出现的。您也可以尝试设置session cookie's domain。
我们终于找到了错误,请求是使用
<a href="" onclick="do_logout()"></a>
这基本上是同时执行 2 个动作并创建竞争条件。这是相关的代码片段
# 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>
感谢您的帮助!
我正在使用 mojolicious 构建 Web 应用程序。注销功能仅在 运行 本地计算机上的应用程序时有效。当我尝试注销服务器上的应用程序 运行 时,会话不会过期并且我仍保持登录状态。
当我们将注销更改为通过 POST 请求而不是 get 完成时,这种情况开始发生。
我们调用注销的方式是来自前端的 AJAX 调用:
function do_logout() {
$.post( "<%= url_for('on_logout') %>", function() {});
}
登出路线:
$if_login->post('/logout')->name('on_logout')->to('user#on_logout');
注销控制器:
sub on_logout {
my $self = shift;
$self->session(expires => 1);
return $self->redirect_to('home');
}
设置会话过期的行被调用,但是在重定向之后,会话仍然包含登录的用户名。
你知道 Mojolicious::Plugin::Authentication 插件吗?这是一个很好的模块,自从我发现 Mojolicious 以来我就一直在使用它。文档指出,您需要将 'expires' 属性设置为过去才能删除会话,但此模块采用另一种方法。
$app->helper(logout => sub {
# omitted
delete $c->session->{$session_key};
});
您可能不仅要尝试设置 'expires' 属性,还要尝试 delete
-ing 会话密钥。
你说这个问题是你把localhost改成域名后出现的。您也可以尝试设置session cookie's domain。
我们终于找到了错误,请求是使用
<a href="" onclick="do_logout()"></a>
这基本上是同时执行 2 个动作并创建竞争条件。这是相关的代码片段
# 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>
感谢您的帮助!