2010-10-07 21 views
13

Tôi có trang web có thời gian chờ phiên là 15 phút. Trên một số trang, người dùng thỉnh thoảng dành hơn 15 phút để trả lời. Giải pháp tốt nhất để duy trì phiên làm việc trong trường hợp này là gì?Làm cách nào để duy trì phiên của người dùng trong khi họ đang đăng trên diễn đàn?

Tôi đã sử dụng JQuery trên các trang này, vì vậy có thể ping máy chủ, nhưng về sự kiện nào?

Phần phụ trợ là Struts trên Tomcat.

+0

15 phút dường như hết sức ngắn. Bạn không thể tăng thời gian chờ? – Eli

Trả lời

24

Do bạn không muốn thay đổi thời gian chờ phiên của trang web ..

Đặt một sự kiện thời gian chờ/interval (< 15 phút) trong javascript và quyết định phải làm gì khi sự kiện này gây nên. Nếu bạn muốn phiên hoạt động miễn là trang được mở, sau đó tốt, hãy ping mỗi < 15 phút. Nhưng đó có lẽ không phải những gì bạn muốn khi người dùng rời khỏi máy tính công cộng sẽ bị đăng xuất tại một số điểm.

Bạn có thể duy trì một biến số lastActivity, được cập nhật trên mỗi lần di chuột tài liệu hoặc khóa tài liệu. Nếu có bất kỳ hoạt động nào kể từ lần ping cuối cùng, hãy ping lại.

Để tinh vi hơn, bạn có thể đếm sự kiện và ping máy chủ chỉ khi số sự kiện> ngưỡng tại thời gian chờ.

Các ví dụ cơ bản:

setInterval(function(){ 
    $.get('/ImStillAlive.action'); 
}, 840000); // 14 mins * 60 * 1000 

Với kiểm tra cơ bản cho hoạt động gõ:

$(function(){ 
    var lastUpdate = 0; 
    var checkInterval = setInterval(function(){ 
     if(new Date().getTime() - lastUpdate > 840000){ 
      clearInterval(checkInterval); 
     }else{ 
      $.get('/ImStillAlive.action'); 
     } 
    }, 840000); // 14 mins * 60 * 1000 

    $(document).keydown(function(){ 
     lastUpdate = new Date().getTime(); 
    }); 
}); 
+1

Nếu người dùng đủ ngu ngốc để bỏ đi để lại trình duyệt mở và đăng nhập, tôi sẽ không bận tâm. – casablanca

+0

Cảm ơn bạn, đó có vẻ là một cách tuyệt vời để làm điều đó. – Nick

0

Bạn có thể thiết lập một khoảng thời gian bao giờ 5 phút:

setInterval(function() { 
    // check if a reply textarea is present on the page and focussed 
    // assuming it's e.g. a textarea with the id "reply" 
    if ($('#reply:focussed').length) { 
     // user is still on the reply page 
     // call on a script on the server that renews the session 
    } 
}, 300000);

Hoặc kiểm tra xem anh/cô ấy vẫn đang nhập nội dung:

<textarea id="reply"></textarea> 
<input type="hidden" id="reply_length" name="length" />
setInterval(function() { 
    // get length of text in textarea 
    var len = $('#reply').val().length; 

    // get previous length 
    var prev = $('#reply_length').val().length; 

    // if they don't match, assume they're doing something 
    if (len != prev) { 
     // renew session 
    } 

    // update previous length 
    $('#reply_length').val(len); 
}, 300000);
3

Tôi nghĩ rằng bạn thực sự không muốn điều này cho TẤT CẢ các trang. Nếu bạn đã làm điều này trên mọi trang, ngay cả những cái thực sự không phụ thuộc vào biến phiên, bạn sẽ tiêu tốn rất nhiều bộ nhớ.

tôi muốn đề nghị ném trong một điều kiện để làm điều đó trên các trang nhất định mà nó là cần thiết, ví dụ:

if (location.href.indexOf('/checkout') !== -1) { 
setInterval(function(){ 
    $.get('/keepalive.action'); 
}, 840000); // 14 mins 
} 
Các vấn đề liên quan