2016-11-17 5 views
0

次のような問題があります。私の春のアプリケーションは、次のように設定されています。セッションタイムアウトの管理方法の期限が切れました

アプリケーションコンテキストのセキュリティ

<http use-expressions="true" pattern="/ext/**" entry-point-ref="loginUrlAuthenticationEntryPoint"> 

    //Others configuration 

    <session-management invalid-session-url="/sessionExpired"> 
    </session-management> 
</http> 

マイコントローラー:

@RequestMapping(value="/sessionExpired", method = RequestMethod.GET) 
public String sessionExpired(ModelMap model, HttpSession session) { 
    return "login"; 
} 

今私の問題は、のsessionExpired方法で、私はいくつかを区別することができるはずということですたとえば、私のユーザーのプロパティ:

@RequestMapping(value="/sessionExpired", method = RequestMethod.GET) 
public String sessionExpired(ModelMap model, HttpSession session) { 

    //Test1 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 
    MyUser u = (MyUser) authentication.getPrincipal(); 

    //Test2 
    MyUser u = session.getAttribute("user"); 

    if(u.isItalian()) 
     return "loginA" 
    else 
     return "loginB" 

    return "login"; 
} 

t sping securityはすでにセッション、要求、SecurityContextHolderをクリーンアップしています。それでは、どうすればこの問題を解決できますか?

+0

一つの選択肢は、sessionExpireイベントを使用することです。それがここでどのように行われたかを見てください。ちょうどイベントをキャッチし、あなたがそこに欲しいものを何でもするhttp://stackoverflow.com/questions/11843010/logout-session-timeout-catching-with-spring-security – george

答えて

-2

SessionExpiredは、セッションが期限切れであるためセッションが存在しないことを意味します。 オプションは、イベントが破棄される前にイベントでSessionを捕捉することです。 幸いにも私はあなたのために、このソリューション/アプローチを見つけた:

http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpSessionListener.html

は、次のようになります。

import javax.servlet.http.HttpSessionEvent; 
import javax.servlet.http.HttpSessionListener; 

public class SessionCounterListener implements HttpSessionListener { 

    private static int totalActiveSessions; 

    public static int getTotalActiveSession(){ 
    return totalActiveSessions; 
    } 

    @Override 
    public void sessionCreated(HttpSessionEvent arg0) { 
    totalActiveSessions++; 
    System.out.println("sessionCreated - add one session into counter"); 
    } 

    @Override 
    public void sessionDestroyed(HttpSessionEvent arg0) { 
    totalActiveSessions--; 
    System.out.println("sessionDestroyed - deduct one session from counter"); 
    } 
} 
+0

私はこの解決策を試していますが、私の問題はどうですか?コントローラーに到着する? – Skizzo

+0

それをwebListenerと組み合わせることはできますか? –

+0

まあ、見回してコーディングを試した後、あなたはリクエストにアクセスできないと思われます。誰にでもリダイレクトすることはできません。 これは本当に難しい問題です。これまでの最善の方法は_sessionId_をクッキーとして保存し、_request_ごとに送信することです。セッションが終了すると、_sessionId_をparamとしてDBからユーザーデータを取得します。次に、この 'user.isItalian()'を特別なページにリダイレクトすることができます。 –

関連する問題