Mojolicious сессия не истекает

Я создаю веб-приложение, используя mojolicious. Функция выхода из системы работает только при запуске приложения на локальных компьютерах. Когда я пытаюсь выйти из приложения, работающего на сервере, срок действия сеанса не истекает, и я остаюсь в системе.

Это начало происходить, когда мы изменили выход из системы, чтобы он выполнялся через запрос 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');
}

Вызывается строка, которая устанавливает срок действия сеанса, но после перенаправления сеанс по-прежнему содержит имя пользователя, под которым был выполнен вход.


person Petru    schedule 09.08.2017    source источник


Ответы (2)


Мы наконец нашли ошибку, запрос был сделан с использованием

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

Спасибо за помощь!

person Bianca    schedule 29.08.2017

Знаете ли вы Mojolicious? Плагин ::Plugin::Authentication? Это хороший модуль, я использую его с тех пор, как открыл для себя Mojolicious. В документации указано, что вам нужно установить атрибут «expires» в прошлое, чтобы удалить сеанс, но этот модуль использует другой метод.

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

Вы можете попробовать не только установить атрибут 'expires', но и delete ввести сеансовый ключ.

Вы сказали, что проблема возникла после того, как вы изменили localhost на доменное имя. Вы также можете попробовать установить домен сеансового файла cookie.

person Laposhasú Acsa    schedule 10.08.2017
comment
Это помогло вам решить проблему? - person Laposhasú Acsa; 14.08.2017