1

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

使用 Tomcat 提供的 webapp“管理器”,我可以监控服务器中的会话。当我想从我的 web 应用程序中注销时,我调用该方法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

您如何使会话无效,您可以显示代码吗?使会话无效的一种方法是

// 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 回答
1

访问 JSP 时会立即创建会话,除非您将 JSP 显式配置为不创建会话,否则 S2 会话拦截器将创建一个(如果您的堆栈包含它)。

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

User在用户登录时将对象之类的东西保持在会话中会更干净、更可靠。

于 2011-11-25T16:21:15.093 回答