私の要件は、ユーザーがWebページでアクティビティを実行しない場合に備えて、ユーザーセッションがx秒でタイムアウトすることを通知するポップアップでユーザーに通知することです。
この要件への追加は、ポップアップで値x秒を動的にデクリメントすることです。
私が使用している環境はJavaEEです。
私の要件は、ユーザーがWebページでアクティビティを実行しない場合に備えて、ユーザーセッションがx秒でタイムアウトすることを通知するポップアップでユーザーに通知することです。
この要件への追加は、ポップアップで値x秒を動的にデクリメントすることです。
私が使用している環境はJavaEEです。
とを利用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>
メッセージ内の時間を魔法のように減らすには、基本的な代わりに、alert()
HTML DOM ツリーを介してコンテンツを制御しsetTimeout()
、テキストを動的に変更するために 1 秒で別のものを使用する div を使用したオーバーレイが必要です。
JspServlet
EL を機能させるには、このスクリプトを から提供する必要があることに注意してください。したがって、スクリプトを JSP ページの HTML に配置する必要があり<head>
ます。または、すべての JS を別のファイルに格納したい場合は、すべての要求も処理*.js
させる必要があります。JspServlet
*.js
Java / Java EEは、クライアント側で(つまり、JavaScriptを使用して)処理する必要があるため、ここではあまり役に立たないと思います。私が考えることができる1つの解決策は、サーバーのタイムアウトの数分前にユーザーに通知する一種のタイマーを設定することです。
これについてグーグルで調べていると、EricPascarelloのUpdateUser's Session with AJAXブログ投稿(およびリロードされたバージョンのUpdateing User Session with Ajax-Round 2)が、そのようなソリューションを正確に説明している(そして、を使用しXMLHttpRequest
てセッションを更新する)ことがわかりました。彼のAjaxセッション管理スクリプトはここから入手できます。
単純なサーブレット、spring-mvc、または spring-security のいずれかである可能性があります。完全なクライアント側のロジックがなければ、自動ログアウトは不可能です。
アプリケーションが両方のタイプのリクエストを持つことを考慮する
自動ログアウトには非常に計算されたロジックが必要です。自動ログアウト機能の実装を次のように提示する
1. 以下に示すように、必要な JSP ページに自動ログアウト スクリプトを含めます。
....
</body>
<jsp:include page="../template/autologout-script.jsp"></jsp:include>
</html>
2. JSP ページ autologout-script.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を以下に追加します。
注: CSS が得意な場合は、autologout-script テンプレート ページに移動できます。したがって、すべてのページにこれを追加することを避けることができます。
ブートストラップを含めるか、カスタム 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 リポジトリから実際の例をダウンロードできます
シンプルなサーブレットの例を使用した自動ログアウト
spring-security Java 構成例
を使用した自動ログアウト spring-security xml 構成例を使用した自動ログアウト
制限事項/必要な改善点
1. 許可される最大セッション数が 1 の場合、セッションが別のシステムから取得されると、AJAX 要求は失敗します。ログインページにリダイレクトするために処理する必要があります。
2. ajaxComplete() の代わりに ajaxStart() を使用して、サーバーとブラウザーの間で idleTime 値を正確に同期します。
要件
1.Jquery
response.setHeader("Refresh", "60; URL=login.jsp");
<meta http-equiv="refresh" content="60; url=login.jsp">