Struts2 这对于会话管理是否正确?

Struts2 这对于会话管理是否正确?,struts2,session-state,Struts2,Session State,我正在为我的web应用程序使用struts2。现在,对于会话管理,我们实际上是在会话中保留用户id(即DB标识符),在注销时,我们从会话对象中删除此用户id。我们的session对象(封装用户id)正在实现sessionaware接口,因此我想我们会在sessionmap中自动获得所有与会话相关的信息 我最讨厌的是注销。我们只是从会话中删除用户id,而不是真正“使”会话无效,类似于session.invalidate() 我对struts2甚至我正在描述的这个产品原型都是新手。所以有人能告诉我从

我正在为我的web应用程序使用struts2。现在,对于会话管理,我们实际上是在会话中保留用户id(即DB标识符),在注销时,我们从会话对象中删除此用户id。我们的session对象(封装用户id)正在实现sessionaware接口,因此我想我们会在sessionmap中自动获得所有与会话相关的信息

我最讨厌的是注销。我们只是从会话中删除用户id,而不是真正“使”会话无效,类似于session.invalidate()


我对struts2甚至我正在描述的这个产品原型都是新手。所以有人能告诉我从会话中删除用户id是否足够,如果不够,我可能会有什么样的安全隐患?我是否也应该在注销时执行session.invalidate?

在大多数情况下,从会话中删除用户id应该足以告诉您的应用程序该用户已注销。如果可以,我还建议删除所有其他会话变量并使会话cookie无效。如果代码使用其他会话变量而没有首先检查是否设置了用户id,则这将防止任何意外行为


我通常将用户id存储在会话中,以指示该用户已登录,并告诉我该用户是谁。如果未设置此值,则我将用户踢到登录页面。

从不执行
会话。无效()只需为session属性设置一个空值就足够了(无需同时删除该属性!)。您的支票应如下所示:

if( is the attribute present is session)
    if( is the value of attribute null) {
         go to login page;
    }
    else {
        go to welcome page;
    }
}
else {
     go to login page;
}
使用
session.invalidate()
意味着你在告诉这个精疲力竭的用户没有有效的会话,他是我们网站的诅咒:)

更新: 来自HTTPSession

使无效

使该会话无效,然后解除绑定到该会话的所有对象


因此,在会话结束后尝试访问会话作用域中存储的变量(如果有)时,您将遇到一个错误。invalidate()

wouldnt session.validate()清除会话中存在的所有数据,从而帮助GC??我不明白
session.invalidate()有什么问题(因为
session.invalidate()
没有问题。您需要支持您的声明,即永远不应该这样做。@arya从session中删除对象(因此引用了这些对象)做同样的事情——在GC方面没有其他好处,除了调用invalidate删除所有会话值,而不是依赖开发人员记住会话中的所有内容。@DaveNewton和arya我已经更新了我的观点,不使用
session.invalidate()
。如果我在这里出错,请纠正我:)我仍然不明白为什么你认为使用它是错误的——事实并非如此。它在生活中的目的是使会话无效并删除当前用户的对象,这几乎总是你在注销时想要做的,并且在你不手动删除为该用户放在那里的所有对象时解决了会话泄漏问题。从ses中删除id这对你来说已经足够了。