在我的注销操作中,我想要使会话无效/清除,我想知道这三种方法之间有什么区别,哪一方面更好:
-> ActionContext.getContext().getSession().clear();
-> getHttpServletRequest().getSession().invalidate()//servlet api
-> ((org.apache.struts2.dispatcher.SessionMap) session).invalidate(); //Struts 2 SessionAware interface
另外,struts 2的“action session”对象和servlet http会话对象之间有什么区别吗?
最后一个问题:是的,正如文档所示。
SessionMap
是一个薄外观,实现了Map
接口,并允许直接访问一些底层实现(例如,invalidate
)。
第一个问题:在最后两个之间,第一个问题略有不同。
clear
只删除条目,IIRC它实际上不会使会话无效。我倾向于使用SessionMap.invalidate()
,因为我试图避免直接与servlet规范绑定,但在这种情况下我不认为它是一个大问题,特别是因为它只能在少数几个地方被调用,例如,登出。
SessionMap#invalidate()
将调用HttpSession#invalidate()
,如果它与HttpSession
相关联并清除内部地图并删除会话关联,所以我会使用它。
唯一的另一个区别是api独立性似乎是SessionMap
为所有会话条目提供entrySet()
方法。条目本身是从相关的HttpSession
中获取的。
SessionMap#clear()
将删除相关HttpSession
中的所有属性,并且不会使该会话无效。
有关更多信息,请查看SessionMap source。
使用此代码可获得更好的结果
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate();
}