2017-08-09 15 views
6

Tôi đang xây dựng một ứng dụng web bằng cách sử dụng mojolicious. Chức năng đăng xuất chỉ hoạt động khi chạy ứng dụng trên các máy cục bộ. Khi tôi cố gắng đăng xuất trên ứng dụng đang chạy trên máy chủ, phiên không hết hạn và tôi vẫn đăng nhập.Phiên tiện ích không hết hạn

Điều này bắt đầu xảy ra khi chúng tôi thay đổi đăng xuất được thực hiện qua yêu cầu POST thay vì nhận.

Cách chúng ta gọi là logout là như một cuộc gọi AJAX từ front-end:

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

Thoát tuyến đường:

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

Thoát điều khiển:

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

dòng mà đặt phiên hết hạn được gọi, nhưng sau khi chuyển hướng, phiên vẫn chứa tên người dùng đã đăng nhập.

Trả lời

1

Cuối cùng chúng tôi tìm thấy các lỗi, các yêu cầu đã được thực hiện sử dụng một

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

được về cơ bản làm 2 hành động cùng một lúc và tạo ra một tình trạng chủng tộc. Dưới đây là đoạn mã có liên quan

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

Cảm ơn bạn đã trợ giúp!

1

Bạn có biết plugin Mojolicious::Plugin::Authentication không? Đó là một mô-đun tốt, tôi đang sử dụng nó vì tôi phát hiện ra Mojolicious. Tài liệu nói rõ rằng bạn cần đặt thuộc tính 'hết hạn' thành quá khứ để xóa phiên, nhưng mô-đun này lại có một phương thức khác.

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

Bạn có thể thử không chỉ thiết lập thuộc tính 'hết hạn' mà còn là delete -ing khóa phiên.

Bạn cho biết sự cố đã xuất hiện sau khi bạn thay đổi localhost thành tên miền. Bạn cũng có thể thử đặt số session cookie's domain.

+0

Điều này có giúp bạn giải quyết sự cố không? –

Các vấn đề liên quan