【问题标题】:Mojolicious session does not expireMojolicious 会话不会过期
【发布时间】:2017-08-09 12:27:46
【问题描述】:

我正在使用 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');
}

调用设置会话过期的行,但重定向后,会话仍然包含登录的用户名。

【问题讨论】:

    标签: session mojolicious perl


    【解决方案1】:

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

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

    这基本上是一次执行 2 个操作并创建一个竞争条件。这里是相关代码sn -p

    # 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>
    

    感谢您的帮助!

    【讨论】:

      【解决方案2】:

      你知道Mojolicious::Plugin::Authentication 插件吗?这是一个不错的模块,自从我发现 Mojolicious 以来我就一直在使用它。文档指出,您需要将 'expires' 属性设置为过去才能删除会话,但此模块采用另一种方法。

      $app->helper(logout => sub {
          # omitted
          delete $c->session->{$session_key};
      });
      

      您可能不仅要尝试设置 'expires' 属性,还要尝试设置会话密钥 delete-ing。

      您说将localhost更改为域名后出现问题。你也可以尝试设置session cookie's domain

      【讨论】:

      • 这对您解决问题有帮助吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 2011-11-28
      • 2013-10-06
      • 2018-10-13
      • 1970-01-01
      相关资源
      最近更新 更多