清除会话的最佳方式

问题描述 投票:1回答:3

在我的注销操作中,我想要使会话无效/清除,我想知道这三种方法之间有什么区别,哪一方面更好:

-> 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会话对象之间有什么区别吗?

java web struts2
3个回答
3
投票

最后一个问题:是的,正如文档所示。

SessionMap是一个薄外观,实现了Map接口,并允许直接访问一些底层实现(例如,invalidate)。

第一个问题:在最后两个之间,第一个问题略有不同。

clear只删除条目,IIRC它实际上不会使会话无效。我倾向于使用SessionMap.invalidate(),因为我试图避免直接与servlet规范绑定,但在这种情况下我不认为它是一个大问题,特别是因为它只能在少数几个地方被调用,例如,登出。


2
投票

SessionMap#invalidate()将调用HttpSession#invalidate(),如果它与HttpSession相关联并清除内部地图并删除会话关联,所以我会使用它。

唯一的另一个区别是api独立性似乎是SessionMap为所有会话条目提供entrySet()方法。条目本身是从相关的HttpSession中获取的。

SessionMap#clear()将删除相关HttpSession中的所有属性,并且不会使该会话无效。

有关更多信息,请查看SessionMap source


0
投票

使用此代码可获得更好的结果

    HttpSession session = request.getSession(false);
    if (session != null) {
        session.invalidate();
    }
© www.soinside.com 2019 - 2024. All rights reserved.