加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Mojolicious会话不会过期

发布时间:2020-12-15 23:36:51 所属栏目:大数据 来源:网络整理
导读:我正在使用mojolicious构建一个Web应用程序.注销功能仅在本地计算机上运行应用程序时有效.当我尝试注销服务器上运行的应用程序时,会话不会过期,我仍然保持登录状态. 当我们通过POST请求更改注销而不是get时,就会发生这种情况. 我们调用logout的方式是来自前
我正在使用mojolicious构建一个Web应用程序.注销功能仅在本地计算机上运行应用程序时有效.当我尝试注销服务器上运行的应用程序时,会话不会过期,我仍然保持登录状态.

当我们通过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 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>

谢谢你的帮助!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读