我试图删除所有会话属性而不会使会话无效,因为我需要一些像这样的会话变量:
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()
。
答案 0 :(得分:1)
确实你收到了这条消息。检查枚举是否至少有一个元素,然后获取并比较一个元素并删除另一个元素。最重要的是“==”比较引用,而不是值。至少你的循环体看起来像
String temp=(String)em.nextElement();
if (!temp.equals("uname")) {
session.removeAttribute(temp);
}
答案 1 :(得分:1)
这段代码中发生了一些奇怪的事情。
em.nextElement()
两次,而对em.nextElement()
的第二次调用并不确保其中存在其他元素。 ==
或!=
,这些运算符检查引用相等性,你想要的是值相等,所以你需要使用{ {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);