2017-08-09 11 views
6

Buduję aplikację internetową przy użyciu mojolicious. Funkcja wylogowania działa tylko podczas uruchamiania aplikacji na komputerach lokalnych. Kiedy próbuję wylogować się z aplikacji uruchomionej na serwerze, sesja nie wygasa i pozostaję zalogowany.Mojolicia sesja nie wygasa

To się zaczęło, gdy zmieniliśmy wylogowanie, które ma być wykonane za pomocą żądania POST, zamiast uzyskać.

Sposób nazywamy wylogowania jako wywołania AJAX z frontend:

function do_logout() { 
    $.post("<%= url_for('on_logout') %>", function() {}); 
} 

trasa Wyloguj:

$if_login->post('/logout')->name('on_logout')->to('user#on_logout'); 

kontroler Wyloguj:

sub on_logout { 
    my $self = shift; 
    $self->session(expires => 1); 
    return $self->redirect_to('home'); 
} 

Linia który ustanawia sesję termin ważności to call, ale po przekierowaniu sesja nadal zawiera nazwę użytkownika, która była zalogowana.

Odpowiedz

1

W końcu okazało się, że błąd, wniosek został wykonany przy użyciu

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

który był w zasadzie robi 2 akcje na raz i tworzenie sytuacji wyścigu. Oto odpowiedni fragment kodu:

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

Dzięki za pomoc!

1

Czy znasz wtyczkę Mojolicious::Plugin::Authentication? To fajny moduł, używam go odkąd odkryłem Mojoliciousa. Dokumentacja stwierdza, że ​​aby usunąć sesję, musisz ustawić atrybut "wygasa" na przeszłość, ale ten moduł przyjmuje inną metodę.

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

można spróbować nie tylko ustawienie „wygasa” atrybut ale również delete -ing klucza sesyjnego.

Powiedziałeś, że problem pojawił się po zmianie localhost na nazwę domeny. Możesz także spróbować ustawić session cookie's domain.

+0

Czy to pomogło w rozwiązaniu problemu? –

Powiązane problemy