通知ユーザセッションタイムアウトにJava EE
-
22-09-2019 - |
質問
私の条件が通知は、ユーザのポップアップという、ユーザのセッションは時にx秒場合はユーザーは行いませんの活動をwebページに備えています。
ほか、この要件は減分の価値をx秒ダイナミックに、ポップアップ.
環境にしてお使いくだJava EE.
解決
<のhref = "http://java.sun.com/javaee/5/docs/api/javax/servlet/http/HttpSession.html#getMaxInactiveInterval%28%29" のrel = "noreferrer" のメイクの使用> HttpSession#getMaxInactiveInterval()
と setTimeout()
に。あなたはすべてのクライアント活動(ポーリング)にタイムアウトを延期する場合を除き、この特定の目的でのAjaxの必要は、ありません。
基本的な例:
<script>
var secondsBeforeExpire = ${pageContext.session.maxInactiveInterval};
var timeToDecide = 15; // Give client 15 seconds to choose.
setTimeout(function() {
alert('Your session is about to timeout in ' + timeToDecide + ' seconds!')
}, (secondsBeforeExpire - timeToDecide) * 1000);
</script>
、代わりにあなたがHTML DOMツリーを介してコンテンツを管理している前記基本alert()
のあなたはdiv要素でオーバーレイをする必要がありますし、変更するには1秒に別のsetTimeout()
を利用して、魔法のメッセージ内の時間を減少するために、テキストを動的ます。
このスクリプトは仕事にELを得るためにJspServlet
によって提供されなければならないことに注意してください。したがって、あなたは、JSPページのHTML <head>
にスクリプトを配置する必要があり、またはあなたが本当に別の*.js
ファイル内のすべてのJSを持つようにしたい場合は、JspServlet
が同様に任意の*.js
要求を処理するようにする必要があります。
他のヒント
私はこの必要性は、クライアント側で処理されるようのJava / Java EEのは(つまりJavaScriptを使用して)ここは本当に参考になるとは思いません。私は考えることができる一つの解決策は、数分、サーバーのタイムアウト前にユーザーに通知しますタイマーの種類を設定することです。
これについてグーグルながら、私はエリックPascarelloの更新ユーザのセッションを見つけAJAX のブログ記事(およびリロードバージョン更新ユーザーセッションにAJAX - ラウンド2 に)正確にこのような解決策を記載している(そして、セッションを更新するXMLHttpRequest
を使用)。彼のAjaxのセッション管理スクリプト可能ですここを。
どちらも簡単にサーブレット、spring-mvc春セキュリティの自動車に使用できませんの最適なクライアント側の論理です。
用を検討するの両方のタイプの要求
- デザイン
- 形で投稿/ページ更新
自動車用ニーズは非常に計算論理です。発表を行うautologout機能の実装には、以下の
利点があります。
1.余話-ご要望はこれを達成する。パフォーマンスへの影響を考慮した場合は10kで現在有効なユーザーが、電話を自動車に使用.
2.一線設定用のタグです。
3.正の場合でもユーザーの開設に複数のタブまたは複数のウインドウです。
4.でintimatesき30秒間のセッション無効なので、入力形式としない提出することができるセッションalive(延長セッションによりワンクリック).でユーザーがゆったり未保存のデータです。
用途
1.自動車用スクリプトに必要なJSPのページとして以下に記す。
....
</body>
<jsp:include page="../template/autologout-script.jsp"></jsp:include>
</html>
2.を作るJSPのページautologout-スクリプトjsp、以下の内容を追加します。 注意:編集/設定が必要
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<script>
$(document).ready(function()
{
var timeOutTimeInSeconds = ${ timeOutTimeInSeconds };
var showTimerTimeInSeconds= ${ showTimerTimeInSeconds };
var sessionCheckIntervalId = setInterval(redirectToLoginPage, timeOutTimeInSeconds * 1000);
var timerDisplayIntervalId = setInterval(showTimer, (timeOutTimeInSeconds - showTimerTimeInSeconds) * 1000);
var badgeTimerId;
window.localStorage.setItem("AjaxRequestFired", new Date());
function redirectToLoginPage(){
//location.href = '<c:url value="/" />'+'${loginPageUrl}';
window.location.reload();
}
$(document).ajaxComplete(function () {
resetTimer();
});
$(window).bind('storage', function (e) {
if(e.originalEvent.key == "AjaxRequestFired"){
console.log("Request sent from another tab, hence resetting timer")
resetTimer();
}
});
function resetTimer()
{
showTimerTimeInSeconds= ${ showTimerTimeInSeconds };
console.log("timeOutTimeInSeconds : "+timeOutTimeInSeconds)
window.localStorage.setItem("AjaxRequestFired", new Date());
window.clearInterval(sessionCheckIntervalId);
sessionCheckIntervalId = setInterval(redirectToLoginPage, timeOutTimeInSeconds * 1000);
window.clearInterval(timerDisplayIntervalId);
timerDisplayIntervalId = setInterval(showTimer, (timeOutTimeInSeconds - showTimerTimeInSeconds) * 1000);
hideTimer();
}
function showTimer()
{
$('#sessionTimeRemaining').show();
$('#sessionTimeRemainingBadge').html(showTimerTimeInSeconds--);
window.clearInterval(timerDisplayIntervalId);
badgeTimerId = setInterval(function(){
$('#sessionTimeRemainingBadge').html(showTimerTimeInSeconds--);
}, 1000);
}
function hideTimer()
{
window.clearInterval(badgeTimerId);
$('#sessionTimeRemaining').hide();
}
});
</script>
3.設定セッションの属性の設定タイムアウトの設定 注意:設定はこの後のセッション。実践できるHttpSessionListener sessionCreated方法及び設定には、以下の設定を実現しています。
session.setMaxInactiveInterval(300);
session.setAttribute("timeOutTimeInSeconds", 300);
session.setAttribute("showTimerTimeInSeconds", 30);
4.以下の内容を追加しますhtmlに表示するタイマー.
注意:で移動できるよautologout-スクリプトテンプレートのページです。このためさせないように指定できますこの機能を追加、ひとつひとつのページです。
を含むブートストラップ追加カスタムcss.
<span class="badge badge-primary" title="click to keep session alive" id="sessionTimeRemaining"
onclick="ajaxSessionRefresh()" style="display:none;">
<i class="badge badge-danger" id="sessionTimeRemainingBadge" style="float:left">30</i>
<small>Refresh</small>
<i class="glyphicon glyphicon-refresh"></i>
</span>
それは簡単に自動車用の実装です。ダウンロードでき作業、例えば私のgithubリポジトリ
Autologoutをシンプルなサーブレットの例
Autologoutを用いたセキュリティjavaの構成例
Autologoutを用いたセキュリティxmlの設定例
論理の説明
例1:ページの負荷
この論理が簡単、ページの荷重設定タイマーの間隔equlasにmaxInactiveInterval.後タイムアウトへのリダイレクトにログインページです。
例2:追跡AJAX通話
を検討AJAXご要望、ご利用いただけます。ajaxStart()または.ajaxComplete()コールバックのjqueryを使う場合ajax要求が発生しでリセットすることができる間隔で出ています。
例3:追跡マルチタ/ウィンドウの活動
Intertab通信を行い同期状態のタブがあります。使用localStorage変更イベントです。
制限事項-改善に必要な
1.場合に許容される最大のセッションであれば、セッションから別のシステムでは、AJAXの要求に失敗します。での取り扱いにリダイレクトにログインページです。
2.利用ajaxStart()の代わりにajaxComplete()を正確な同期のidleTime価値とサーバーとブラウザです。
要件
1.Jquery
代替現在の実装に比べて
1. 設定をリフレッシュヘッダー httpに応じます。 (作AJAXご要望)
response.setHeader("Refresh", "60; URL=login.jsp");
- 設定メタリフレッシュタグ HTMLにおける (作AJAXご要望)
<meta http-equiv="refresh" content="60; url=login.jsp">
- 設定チェッカーの活動
続くセッションによる繰り返しAJAXます。トラックアイドル時間は、使用後に、請求タイムアウト.
間違いなしができない生活を送っていると簡単なロジックしていきたいと思っているだけでインクは私の観測。- パフォーマンスへの影響 2の場合の請求は当たり分けセッションの生50kています。100kの要求であります。
- Intertab通信 場合にタブが二つ開くので、タブを受け活動が他のタブを受けていない活動は、タブの火災に使用請求を無効にするセッションも活動を現在のタブがあります。ができる取り扱い)
- 力使用方法 では、クライアントは主サーバの消します。