2016-09-15 4 views
0

こんにちは、/logoutサーブレットからセッションタイムアウトを計算しようとしています。私はAJAX呼び出しと、このメソッドを毎秒のヒットセッションタイムアウトを動的に計算する方法は?

import java.io.IOException; 
    import java.util.logging.Level; 
    import java.util.logging.Logger; 

    import javax.servlet.ServletException; 
    import javax.servlet.annotation.WebServlet; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 
    import javax.ws.rs.core.MediaType; 
    import com.sun.jersey.api.client.ClientResponse.Status; 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 

    long timePassed = 0; 
    long timeout = 60; 

    timePassed = (System.currentTimeMillis() - request.getSession().getLastAccessedTime())/1000; 
    System.out.println(timePassed); 

    response.setStatus(Status.OK.getStatusCode()); 
    response.getWriter().write("[{\"timePassed\": \""+ timePassed + "\", \"limit\": \""+ timeout + "\"}]"); 
    response.setContentType(MediaType.APPLICATION_JSON); 

    if(timePassed >= timeout){ 
     doGet(request, response); 
    } 

} 

:私は私のdoPostメソッドはこちらtimeout

としてタイムアウトする前に、ある程度の時間を定義しています。 ajax呼び出しは正常に動作します。私はフロントエンドでデータを取得しているので、GUIは正常に動作します。 BUT timePassedは0のままです。ユーザーがアイドル状態で過ごした時間を計算するにはどうすればよいですか?

+0

Ajaxを使用してサーバーにアクセスすると、セッションアクセスとしてカウントされます。そうすることで、セッションが終了するのを防ぎます。 – developerwjk

+0

@developerwjkはい私はまだ別の方法でそれをやり遂げる方法についていることに気づきました。 – th3r1singking

+0

アイドルと言うと、どういう意味ですか?セッションを作成する時間がありますが、セッションが作成されてからの経過時間は「アイドル」ではないという違いがあります。 – stdunbar

答えて

1

クリックやマウスの動きを検出するのにJavaScriptを使用しないのはなぜですか?

jQueryのまたはネイティブJavascriptが...あなたが必要なものを達成することができ

[編集] certainsは、バックエンドのリリースにアイドルタイムを呼び出す場合

、あなたはJavascriptを有するものを監視することができます:-)

+0

はい私はそれを考え出しました。しかし、私がやっていることは、バックエンドに残された時間を保つことです。私は複数のタブにまたがってセッションを維持し、それらを同期させておくことができます。 – th3r1singking

+1

私はストア(データベース、ファイル、Javaのセッションオブジェクト[存在する場合])に格納し、ユーザーがサーバーに再度アクセスすると、最後に格納された日付時刻を取得します。認証を使用していますか?データベースの{Key:UserX、Value:20160916 16:27}のストレージの例。ユーザがヒットした場合、そのユーザが最後にアクティブになった時間を取得します。 クライアントとサーバ間でデータを同期する必要がある場合、サーバがWebソケット、ポーリングなどを使用してクライアントと通信できるSignalRまたはその他のlibを使用します。 –

1

timePassedは0になります。サーブレットを直接呼び出していると思います。

は、一つのことを行い、以下のコードでは、いくつかのデバッグポイントを追加し、デバッグモードでサーバーを再起動してください。デバッガがデバッグポイントに5〜6秒待機すると、F8キーを押してデバッグを中断します。あなたは間違いなく0

timePassed = (System.currentTimeMillis() - request.getSession().getLastAccessedTime())/1000; 
System.out.println(timePassed); 

つ以上のトリック、代わりのデバッグよりtimePassedのためのいくつかの値が他の取得します。 timePassed値がゼロになったら、数秒待ってからページを更新してください(フォームを再送信してください)。あなたは以下のように出力が得られます:

Session TimeOut

あなたが最初のサーブレットにリダイレクトするときに、セッションが始まったばかりされているので、経過セッション時間は、0で、これはあります。同じセッションで新しいリクエストが行われたときには時間が長くなります。

希望すると、これが役立ちます。

関連する問題