web-dev-qa-db-ja.com

JAVAのsession.invalidate()の後でセッションがnullにならないのはなぜですか?

JavaEE WEBアプリケーションの開発中に非常に奇妙な問題に直面しています。

session.invalidate();を使用してHttpSessionを無効にした後でも、セッションnullを取得できません。セッションを無効にした後、以下のように1つのステートメントを実行している場合があります。

if (null != session && null != session.getAttribute("loginToken")){
   //do something
}

ここではセッションnullを取得していないため、2番目の条件が実行されます。したがって、セッションはnullではないため、IllegalStateException-session is already invalidated。しかし、なぜそれを無効にした後でセッションがnullにならないのですか? :(

9

session.invalidate()を呼び出すと、セッションがレジストリから削除されます。その後getSession(false)を呼び出すとnullが返されます(この場合、getSession()またはgetSession(true)は新しいセッションを作成することに注意してください)。 invalidate()を呼び出すと、セッションにバインドされているすべてのセッション属性も削除されます。ただし、コードがセッションまたはその属性への参照をまだ持っている場合、これらは引き続きアクセス可能です。

    // create session if none exists (default) and obtain reference
    HttpSession session = request.getSession();

    // add a session attribute
    session.setAttribute("lollypop", "it's my party");

    // obtain reference to session attribute 
    Object lollypop = session.getAttribute("lollypop");

    // print session ID and attribute
    System.out.println(session.getId());
    System.out.println(lollypop);

    session.invalidate();

    // session invalidated but reference to it still exists
    if (session == null) {            
        System.out.println("This will never happen!");
    }

    // print ID from invalidated session and previously obtained attribute (will be same as before)
    System.out.println(session.getId());
    System.out.println(lollypop);

    // print 'null' (create=false makes sure no new session is created)
    System.out.println(request.getSession(false));

出力例:

1k47acjdelzeinpcbtczf2o9t
it's my party
1k47acjdelzeinpcbtczf2o9t
it's my party
null

これまでのところ説明。あなたの問題を解決するには、次のことを行う必要があります。

HttpSession existingSession = request.getSession(false);
if (existingSession != null && existingSession.getAttribute("loginToken") != null){
   //do something
}
13
Adriaan Koster

Invalidateメソッドは以下を実行します( [〜#〜] api [〜#〜] から):

Invalidates this session then unbinds any objects bound to it.

HttpSession- object自体については何も言われませんが、セッションの変数は無効になります。クラスのメソッドを呼び出す場合、そのメソッドの呼び出し後にオブジェクトをnullにすることはできません。後でセッションをnullにする必要がある場合は、メソッドに次のような行を含める必要があります:this = null;これは不可能です。無効化されたセッションに対して例外をスローすることは、そのための推奨される方法です。

4
Pphoenix

GetSession(boolean)のパラメーターとしてfalseを渡してみてください。これにより、セッションが存在する場合はセッションが返され、そうでない場合はnullが返されます。

HttpSession session = request.getSession(false);
if(session==null || !request.isRequestedSessionIdValid() )
{
    //comes here when session is invalid.

}
1
Shivam Bansal