2017-08-09 4 views
6

Ich baue eine Webanwendung mit mojolicious. Die Abmeldefunktion funktioniert nur, wenn die App auf lokalen Computern ausgeführt wird. Wenn ich versuche, mich bei der auf dem Server laufenden App abzumelden, läuft die Sitzung nicht ab und ich bleibe angemeldet.Mojolicious Sitzung läuft nicht ab

Dies begann zu geschehen, als wir die Abmeldung änderten, um über die POST-Anfrage statt get zu erfolgen.

Die Art, wie wir Abmelde nennen, ist als AJAX-Aufruf vom Frontend:

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

Logout Route:

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

Logout-Controller:

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

Linie, die setzt die Sitzung zu verfallen wird aufgerufen, aber nach der Umleitung enthält Sitzung noch den Benutzernamen, der angemeldet war.

Antwort

1

Wir haben endlich den Fehler gefunden wurde der Antrag einer

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

, die zwei Aktionen auf einmal und die Schaffung eines Race-Bedingung im Grunde tat mit gemacht. Hier ist das entsprechende Code-Snippet

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

Vielen Dank für Ihre Hilfe!

1

Kennen Sie das Mojolicious::Plugin::Authentication Plugin? Es ist ein schönes Modul, das ich benutze, seit ich Mojolicious entdeckt habe. Die Dokumentation besagt, dass Sie das Attribut 'expires' auf die Vergangenheit setzen müssen, um die Sitzung zu löschen, aber dieses Modul verwendet eine andere Methode.

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

Sie können nicht wollen, nur versuchen, die Einstellung der ‚abgelaufen‘ -Attribut, sondern auch delete -ing den Sitzungsschlüssel.

Sie sagten, dass das Problem aufgetreten ist, nachdem Sie localhost zu einem Domain-Namen geändert haben. Sie können versuchen, die session cookie's domain auch einzustellen.

+0

Hat dies Ihnen geholfen, das Problem zu lösen? –

Verwandte Themen