销毁所有会话变量而不会使会话java无效

时间:2017-07-24 03:08:01

标签: java session httpsession

我试图删除所有会话属性而不会使会话无效,因为我需要一些像这样的会话变量:

    session.setAttribute("fatal", "fatal error");
    session.setAttribute("sgadded", "Added");
    session.setAttribute("sgverified", "Something");
    session.setAttribute("sgmodified", false);
    session.setAttribute("glexists", false);
    session.setAttribute("fatal", false);
    session.setAttribute("gladded", false);
    Enumeration em = session.getAttributeNames();
    while(em.hasMoreElements()){
        if((String)em.nextElement() != "uname"){
            session.removeAttribute((String)em.nextElement());
        }
    }

但是我收到了一个错误:

java.util.NoSuchElementException
    at java.util.HashMap$HashIterator.nextEntry(HashMap.java:925)
    at java.util.HashMap$KeyIterator.next(HashMap.java:956)
    at java.util.Collections$2.nextElement(Collections.java:3665)

是否有更好的方法可以一次性删除所有会话变量而不会使会话无效。我此时不想致电session.invalidate()

3 个答案:

答案 0 :(得分:1)

确实你收到了这条消息。检查枚举是否至少有一个元素,然后获取并比较一个元素并删除另一个元素。最重要的是“==”比较引用,而不是值。至少你的循环体看起来像

String temp=(String)em.nextElement();
if (!temp.equals("uname")) {
    session.removeAttribute(temp);
}

答案 1 :(得分:1)

这段代码中发生了一些奇怪的事情。

  • 首先,您在while循环中调用em.nextElement()两次,而对em.nextElement()的第二次调用并不确保其中存在其他元素。
  • 其次,在Java中进行字符串比较时,你不应该使用==!=,这些运算符检查引用相等性,你想要的是值相等,所以你需要使用{ {1}}方法。在您的情况下,.equals。作为一个快速说明,请注意我们如何在此字符串相等性中首先使用字符串文字。这是在Java中执行此操作的首选方法,因此如果!"uname".equals((String)em.nextElement())恰好为null,则此代码不会抛出令人讨厌的em.nextElement()(因为.equals方法检查null,并且如果参数为null,则返回false)

因此,您的代码最终会看起来像:

NullPointerException

答案 2 :(得分:1)

它也有效

Collections.list(session.getAttributeNames())
                .stream()
                .filter(s -> !s.equals("uname"))
                .forEach(session::removeAttribute);