【发布时间】:2016-05-11 10:33:12
【问题描述】:
我想在 JSP 页面中重置会话而不使其无效。
这样做的原因是,用户可能已经使用会话打开了一个页面,并且将其无效会抛出一个NullPointerException。由于已经捕获了新会话,因此我不想添加额外的流行语。目标是清除所有属性。
我正在寻找类似的东西:
session = new HttpSession(); //this does obviously not work
另一种选择是(?)
while(session.getAttributeNames().hasMoreElements()){
session.removeAttribute(session.getAttributeNames().nextElement());
} //cleans session?
但我不确定,这是否会删除一些必要的会话属性,例如登录数据。
有什么好的方法吗?
编辑:最好的解决方案是,每次打开某个页面时,您都会为该窗口/标签创建一个新会话,直到您关闭标签或在此标签中重新访问该页面。这个问题是在尝试解决this problem.时出现的
【问题讨论】:
-
但是,杀死所有值不会有风险访问不再可用的项目吗?您能否解释一下在哪些情况下您需要“清理”会话而不是更新会话?
-
@Jan 在会话中我保存了一些用于控制保存的大量数据,因此我想完全刷新会话。但在其他一些选项卡中,我可能有一个其他控件运行的打开页面,我不喜欢用 NullPointer 崩溃。所以一个新的会话也可以,但如果我使用无效,它只是将另一个选项卡中的会话设置为
null,这有点孬。不再可用的问题已经被捕获,因此我不想添加另一个短语。 -
好的。在多个会话属性下拥有所有这些数据可能很困难 - 您可能最终会得到您建议的循环。但是如何使用 one 会话密钥并为该密钥存储
Map<String,Object>呢?这样你就可以((Map)session.getAttribute("myKey")).clear(); -
这将是一种方式,但对我来说似乎有点开销,因为那时我需要在每个会话属性中添加地图(并且现在更改很多代码)。我只是希望,有一种方法或方式可以直接在会话中执行此操作(如问题中的第一行),以便在没有新请求的情况下应用新的会话实例或清理会话。
-
所以你想在一个页面中重置会话中的所有数据,但在另一个页面中仍然存在?