web-dev-qa-db-ja.com

ユーザーがフォーラムに投稿している間、ユーザーのセッションを存続させるにはどうすればよいですか?

セッションタイムアウトが15分のサイトがあります。一部のページでは、ユーザーが返信の入力に15分以上かかることがあります。この場合、セッションを存続させるための最良の解決策は何ですか?

私はすでにこれらのページでJQueryを使用しているので、サーバーにpingを実行する可能性がありますが、どのイベントでですか?

バックエンドはStruts上のTomcatです。

14
Nick

サイトのセッションタイムアウトを変更したくない場合。

Javascriptでタイムアウト/間隔(<15分)イベントを設定し、イベントがトリガーされたときに何をするかを決定します。ページが開いている限りセッションをアクティブにしたい場合は、15分未満ごとにpingを実行してください。しかし、公共のコンピューターを離れるユーザーは、ある時点でログアウトする必要があるため、これはおそらくあなたが望んでいることではありません。

変数lastActivityを維持できます。この変数は、ドキュメントのマウス移動またはドキュメントのキーダウンごとに更新されます。前回のping以降にアクティビティがあった場合は、もう一度pingを実行します。

より洗練されたものにするために、イベントの数がタイムアウト時にしきい値を超えた場合にのみ、イベントをカウントしてサーバーにpingを実行できます。

基本的な例:

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

タイピングアクティビティの基本的なチェック:

$(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();
    });
});
28
Alexander Sagen

しかし、すべてのページでこれを本当に望んでいないと思います。すべてのページでこれを行うと、セッション変数に実際に依存しないページであっても、大量のメモリを消費することになります。

必要な特定のページでのみ実行するように条件付きでスローすることをお勧めします。

if (location.href.indexOf('/checkout') !== -1) {
setInterval(function(){
    $.get('/keepalive.action');
}, 840000); // 14 mins
}
3
Phil LaNasa

5分ごとに間隔を設定できます。

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

または、彼/彼女がまだ何かを入力しているかどうかを確認します。

<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);
0
Alec