当我们通过POST请求更改注销而不是get时,就会发生这种情况.
我们调用logout的方式是来自前端的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');}
将会话设置为过期的行被调用,但在重定向之后,会话仍包含登录的用户名.
解决方法 我们终于找到了错误,请求是使用了<a href="" onclick="do_logout()"></a>
这基本上是一次做两个动作并创造一个竞争条件.这是相关的代码段
# Relevant routesmy $if_login = $r->under('/')->to('user#is_logged_in');$if_login->post('/logout')->name('on_logout')->to('user#on_logout');# Controller functionssub 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会话不会过期全部内容,希望文章能够帮你解决Mojolicious会话不会过期所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)