1

私は自分のアクションでSessionMap (org.apache.struts2.dispatcher.SessionMap<K,V>)セッションを追跡するために a を使用しています。invalidate()ログアウトには、SessionMap が提供するメソッドも使用します。

Tomcat が提供する webapp "manager" を使用して、サーバーのセッションを監視できます。webapp からログアウトするときは、メソッドを呼び出しますinvalidate()

しかし、このメソッドを呼び出した後、セッションは期限切れになりません! Invalidate()メソッドは、セッションに保存されたオブジェクトのみを削除します (たとえば、login()セッションが存在する後に作成されたユーザー オブジェクト)。

私の説明が明確であることを願っていますが、どうすればこの問題を解決できますか? 前もって感謝します

私のコード:

public String execute(){

    User user = authenticateUser( getUsername(), getPassword() ); 
    if ( user == null )
    {
        /* User not valid, return to input page. */
        return INPUT;
    }
    else{
        session.put( "user", user );
    }

    return SUCCESS;
}

そして、次のようにセッションを無効にします。

public String logout(){
    session.invalidate();   
    System.out.println("LOGOUT");
    return "logout";
}

セッションは次のとおりです。

private SessionMap<String, Object> session;
4

2 に答える 2

1

JSP がセッションを作成しないように明示的に構成しない限り、JSP にアクセスするとすぐにセッションが作成されます。また、S2 セッション インターセプターがセッションを作成します (スタックにセッションが含まれている場合)。

とはいえ、セッションから既知のオブジェクトを削除するだけで、ユーザーがログアウトしているかどうかを示すことができます。セッションがないことに依存すると、余分な作業が必要になり、かなり脆弱です。JSP に通知するのを忘れるだけです。セッションを作成しないページはセッションを作成します。

Userユーザーがログインしている間、オブジェクトのようなものをセッションに保持する方が、はるかにクリーンで信頼性が高くなります。

于 2011-11-25T16:21:15.093 に答える
1

セッションを無効にする方法を教えてください。コードを表示できますか? セッションを無効にする1つの方法は

// Code fragment from class implementing SessionAware containing the 
// session map in a instance variable "session". Attempting to invalidate 
// an already-invalid session will result in an IllegalStateException.
if (session instanceof org.apache.struts2.dispatcher.SessionMap) {
    try {
        ((org.apache.struts2.dispatcher.SessionMap) session).invalidate();
    } catch (IllegalStateException e) {
        logger.error(msg, e);
    }
}

Daveさらに、セッションから特定のインスタンスを削除することを心配する必要があることに同意します

于 2011-11-25T16:22:05.827 に答える