セッションタイムアウトが15分のサイトがあります。一部のページでは、ユーザーが返信の入力に15分以上かかることがあります。この場合、セッションを存続させるための最良の解決策は何ですか?
私はすでにこれらのページでJQuery
を使用しているので、サーバーにpingを実行する可能性がありますが、どのイベントでですか?
バックエンドはStruts
上のTomcat
です。
サイトのセッションタイムアウトを変更したくない場合。
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();
});
});
しかし、すべてのページでこれを本当に望んでいないと思います。すべてのページでこれを行うと、セッション変数に実際に依存しないページであっても、大量のメモリを消費することになります。
必要な特定のページでのみ実行するように条件付きでスローすることをお勧めします。
if (location.href.indexOf('/checkout') !== -1) {
setInterval(function(){
$.get('/keepalive.action');
}, 840000); // 14 mins
}
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);