Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Struts2-SessionMap的invalidate()方法真的使会话无效吗?_Struts2_Tomcat6_Logout_Session Management - Fatal编程技术网

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

Struts2-SessionMap的invalidate()方法真的使会话无效吗?,struts2,tomcat6,logout,session-management,Struts2,Tomcat6,Logout,Session Management,我在我的操作中使用了一个SessionMap(org.apache.struts2.dispatcher.SessionMap)来跟踪我的会话。 我还使用SessionMap提供的方法invalidate()注销 使用Tomcat提供的webapp“manager”,我可以监视服务器中的会话。 当我想从我的webapp注销时,我调用方法invalidate() 但是调用此方法后,会话不会过期! Invalidate()方法仅删除会话中存储的对象(例如,在login()之后创建的用户对象,但会话存

我在我的操作中使用了一个
SessionMap(org.apache.struts2.dispatcher.SessionMap)
来跟踪我的会话。 我还使用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;
私有SessionMap会话;

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

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


当用户登录时,在会话中保留像
用户
对象这样的对象更干净、更可靠。

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

// 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
您应该关心从会话中删除一个特定的实例

@rosanero4还可以,但这与我所说的并不相关。@Dᴀᴠᴇ Nᴇᴡᴛᴏɴ按照您的建议,当用户登录时,我将用户对象保持在会话中。当我使会话无效时,用户对象将被“删除”从会话开始,但会话仍然存在。@Rosanero4正如我所说的,会话将在您访问JSP时出现,并且不会显式声明JSP以避免会话。如果会话为空,您为什么会关心会话是否存在?您正在尝试微优化一些无关紧要的东西。@Dᴀᴠᴇ NᴇᴡᴛᴏɴDave!我想了解会话是如何使用我在代码中使用的方法工作的。但是,正如您所写的,我希望进行微优化,因为我关心服务器上的性能。因此,我不关心内部没有任何对象的会话。对吗?:-)@Rosanero4是否需要进行微优化。设置您不想创建会话的每个JSP页面。不过,我不知道您认为自己真正节省了什么——您为确保跟上所有页面和应用程序流而付出的努力,100%不值得一点小小的内存优势(每个用户可能节省1K-2K,因此在您注意到之前,您需要数千个用户)。玩得开心。@Rosanero4从会话中删除用户是您的最终目标,除了我同意Dave在他的帖子中所说的之外,删除方法可以最好地实现这一目标。是否有使会话无效的特殊要求?我考虑服务器性能。我不希望会话中没有任何对象。:)你必须要求jsp不要为你创建会话实例,而struts2 session和lazy意味着它们不在那里,除非你要求它们,老实说,这方面不会影响你的应用程序的整体性能。所以……我太精确和谨慎了。我永远不会关心会话的这些方面:-)@Rosanero4如果你想避免会话创建,请看Dave的评论,老实说,我从未尝试过这样级别的优化,因为它不会提供太多值得你投入的结果。这就是说,休息是你的全部选择