2016-03-27 10 views
1

ユーザーが10分間アクティブでなくてもユーザーがページsessionlocked.jspにリダイレクトされた場合、セッションをブロックせずにサーブレットをプログラムします。ユーザーが指定された時間非アクティブのときにユーザーを特定のページにリダイレクト

私はこのコードをテストしましたが、動作しません。

session.setMaxInactiveInterval(10*60); 
if (request.getSession(false) == null) { 
    response.sendRedirect(url); 
} 

どうすればこの問題を解決できますか?

答えて

-1

documentation;サーブレットコンテナがこのセッションを無効化する前に

setMaxInactiveInterval(int型の間隔)は

クライアント要求間の時間を秒単位で指定します。

したがってsetMaxInactiveIntervalの方法は、セッションを無効にします。

ロックされたページをユーザーに表示するには、2つの方法があります。

まず、時間がオーバー lockedpageそうでない場合はリセット時にリダイレクトされている場合

フィルタを使用してセッション時間をチェックします。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpSession session = ((HttpServletRequest) request).getSession(false); 
    if (session == null) { 
     // ((HttpServletRequest) request).getSession(true); 
     // redirect to logout or anywhere you want, to create a session 
     return; 
    } 
    // Check if filter also work for sessionlocked.jsp 
    if (((HttpServletRequest) request).getRequestURL().toString().contains("sessionlocked")) { 
     chain.doFilter(request, response); // no need to check sessionlocked 
     return; 
    } 
    long lastAccessTime = session.getLastAccessedTime(); 
    long tenMinuteAsMilisecond = 10 * 60 * 1000; 
    if (lastAccessTime + tenMinuteAsMilisecond > (new Date()).getTime()) { 
     chain.doFilter(request, response); // session still not locked 
    } else { 
     ((HttpServletResponse) response).sendRedirect("sessionlocked.jsp"); 
    } 
} 

セカンド(最初に加えて最初の試みは、サーバ側で制御されるため)。

JavaScriptを使用してカウントダウンし、時間が経過したら、ロックされたページ にリダイレクトします。

window.onload = function() { 
     setInterval(function() { 
      window.location.replace("/sessionlocked.jsp"); 
       }, 600000); 
    } 

のみサーブレットが必要な場合は、 (サーブレットとのユーザーの対話)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    HttpSession session = request.getSession(false); 
    if (session == null) { 
     request.getSession(true); 
     // redirect to logout or anywhere you want, to create a session 
     return; 
    } 
    long lastAccessTime = session.getLastAccessedTime(); 
    long tenMinuteAsMilisecond = 10 * 1000;// to test lock time set to 10 seconds 
    if (lastAccessTime + tenMinuteAsMilisecond > (new Date()).getTime()) { 
     response.getOutputStream().print("Session not locked" + i++); 
     // TODO for not locked code 
    } else { 
     response.getOutputStream().print("Session locked"); 
     //redirect to sessionlocked.jsp 
    } 
} 

サーブレット出力(ロック時間は10秒に設定)。 Servlet output

+1

セッションが期限切れになった場合(getSession()は新しいものを提供します)、フィルタの試行は機能しません。 JSの試行では、クライアントが同じセッションで複数のページ(タブ/ウィンドウ)を開いているときに奇妙な結果が得られます。セッションがサーバー側で期限切れになったときにユーザーをすぐにリダイレクトするという要件に対する正しいアプローチはどちらもありません。 – BalusC

+0

@BalusC私はまだ答えを編集していると推測し、コードの上記のコメントを追加する、私は答えが-1ポイントに値しないと思う、それはちょっとした行動です:) –

+0

答えは現在のフォームに間違っています。もちろん、解決策の代わりに回避策が提案された場合、具体的な要件を実際に解決して解決し、すべての可能性のある警告を記述するように投稿が修正されれば、ダウンボートは削除されます。 – BalusC

関連する問題