2016-09-28 20 views
0

私はロード可能な特定のapi URLを作成しようとしていますが、ユーザのセッション「最終アクティビティ」を更新することはありません。特定のURLでセッションを使用しないでください

HttpSession.setMaxInactiveInterval()server.session.timeout、および春のセキュリティを介して、60分間使用しないとユーザーがログアウトするように設定しました。これはうまくいきます。さて、私は、クライアントが呼び出すことができるAPI呼び出しを構築しようとしています。しかし、問題の要点は、私がAPIを呼び出すと、これがユーザーのアクティビティとみなされ、目的を破ってさらに60分間セッションが更新されるということです。

私は、特定のURLに対してセッションの使用を無効にする方法があると考えています。送信されたクッキーを介して手動でセッションIDを取得し、セッションオブジェクトを手動で検索して、最後のアクティビティを更新せずに必要な情報を取得できます。

答えて

2

おそらく、独自のセッション無効化ロジックを作成するのが最良です。
多くのハッキング作業を行うことなく、Tomcatのアクセス時間の動作を手動で制御することはできません。
ページ(ホワイトリストに登録されたページ以外)が最後にアクセスされた時刻を追跡し、しきい値を超えたセッションを無効にするサーブレットフィルタを作成できます。

public class AccessTimeFilter implements Filter { 

    private static final long ACCESS_TIME_WINDOW = 30 * 60 * 1000;//30 Mins 
    private static final Set<String> IGNORED_URLS = new HashSet<>(Arrays.asList("/myurl", "/someOtherUrl")); 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) 
      throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpSession session = request.getSession(); 
     Long realLastAccessedTime = (Long) session.getAttribute("realLastAccessedTime"); 
     if(realLastAccessedTime != null && 
       realLastAccessedTime < (System.currentTimeMillis() - ACCESS_TIME_WINDOW)){ 
      session.invalidate(); 
     } 

     doFilter(req, res, chain); 

     String url = request.getServletPath(); 
     if(!IGNORED_URLS.contains(url)){ 
      session.setAttribute("realLastAccessedTime", System.currentTimeMillis()); 
     } 
    } 
関連する問題