4

私はSpringセキュリティを備えたgrailsWebアプリケーションに取り組んでいます。セッションがアクティブな場合でも、一定の時間の後にセッションの有効期限を強制する必要があります。

フィルタを追加して、各リクエストの最終ログイン時刻を確認できると思います。

if (CURRENT_TIME - LAST_LOGIN > ABSOLUTE_SESSIO EXPIRATION) then FORCE LOGOUT

ただし、問題は、ユーザーが要求するまで、セッションがサーバー上でアクティブなままであるということです。

ユーザーがシステムを使用している場合でも、N分後にセッションを破棄することは可能ですか?私はTomcatセッション管理と、Spring Securityがそれをどのように処理するかを調査していましたが、有用な情報は見つかりませんでした。

誰かが私にいくつかの例を教えてもらえますか?誰かが似たようなものを実装しましたか?

4

1 に答える 1

5

[編集: ログイン時間によって決定される特定の時間にセッションを強制終了するためのアイデアは、Quartzのようなタスク スケジューラを使用して、セッションにパラメーターとして渡されるタスクをスケジュールすることです。session.invalidate()次に、特定の時点で実行するジョブを呼び出すようにスケジュールできます。タスクはログイン時にスケジュールされます。]

これは私が行う方法ですが、必要な特定の時間にセッションを強制終了することはありません。リクエストを行うユーザーに依存します。絶対確実というわけではありませんが、おそらく AJAX 呼び出しを介して、1 分ごとにアプリケーションがサイトをポーリングするようにすることができます。

ユーザー セッションでセッション アクティベーション時間を設定します。次に、(アクティブ化期間 + 許可された時間) が現在の時間を超えていることを確認するすべての着信要求に対して、Web アプリケーションにフィルターを追加します。そうでない場合は、session.invalidate(); を呼び出します。

つまり、ログイン時

HttpSession session = request.getSession();
session.setAttribute( "activation-time", System.currentTimeMillis() );

次に、フィルターを web.xml に追加します。

<filter>
    <filter-name>SessionFilter</filter-name>
    <filter-class>com.something.SessionFilter</filter-class>
    <init-param>
        <param-name>max-period</param-name>
        <param-value>60000</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SessionFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

フィルターは次のようなものになります...

package com.something;

import java.io.IOException;
import java.util.Date;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class SessionFilter implements Filter {
    private long maxPeriod;

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpSession session = request.getSession( false );
        if ( session != null ) {
            long activated = (long) session.getAttribute( "activation-time" );
            if ( System.currentTimeMillis() > ( activated + maxPeriod ) ) {
                 session.invalidate();
            }
        }
        chain.doFilter(req, res);
    }

    public void init(FilterConfig config) throws ServletException {
        //Get init parameter
        if ( config.getInitParameter("max-period") == null ) {
             throw new IllegalStateException( "max-period must be provided" );
        }
        maxPeriod = new Long( config.getInitParameter("max-period") );
    }

    public void destroy() {
        //add code to release any resource
    }
}

セッションが無効化されたときに何かを呼び出す必要がある場合はHttpSessionListener、web.xml に記述して構成することもできます。

于 2012-10-18T20:58:13.553 に答える