Struts2 - SessionMap的invalidate()方法是否真的使会话无效?

时间:2011-11-25 16:11:21

标签: struts2 tomcat6 logout session-management

我在我的行动中使用SessionMap (org.apache.struts2.dispatcher.SessionMap<K,V>)来跟踪我的会话。 我还使用SessionMap提供的方法invalidate()进行注销。

使用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;

2 个答案:

答案 0 :(得分:1)

一旦访问JSP就会创建会话,除非您明确地将JSP配置为不创建会话,而S2会话拦截器将创建一个(如果您的堆栈包含它)。

也就是说,从会话中删除已知对象应该只是指示一个人是否已注销所需的所有内容 - 依赖于没有会话需要太多的额外工作,并且相当脆弱 - 只是忘记告诉JSP页面不创建会话就会创建它。

在用户登录时,在会话中保留类似User对象的内容会更清晰,更可靠。

答案 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您应该关注从会话中删除特定实例