JSF:清除会话Scoped Bean
我想知道,在用户关闭JSF 1.2上的窗口(点击浏览器的’X’)之后,我将如何在JSF中执行session.remove("userBean")
。
我想在用户点击浏览器的’X’之后弹出一个确认弹出,但不太确定我如何访问或将Ok
按钮绑定到我定义的方法,在那里我有清除scoped bean的逻辑。 或者有更好的方法吗?
任何帮助将受到高度赞赏。
谢谢。
我想知道,在用户关闭JSF 1.2上的窗口(点击浏览器的’X’)之后,我将如何在JSF中执行session.remove(“userBean”)。
你不必担心它。 如果会话超时,那么肯定会删除bean。 如有必要,您可以在web.xml
中的
中控制会话超时期限。 如果你真的想挂钩会话超时/销毁,那么你可以在sessionDestroyed()
上实现HttpSessionListener
和拦截,或者让UserBean
实现HttpSessionBindingListener
并拦截valueUnbound()
。
如果你真的坚持要听浏览器关闭按钮,这毕竟是更多的工作,那么你所能做的就是使用Javascript的beforeunload
事件。 没有别的办法。 您应该记住,这是一个不标准的事件,因此并非所有Web浏览器都支持这一事件。 例如,Opera不支持此事件。 简化这项工作非常方便,因为当您进行简单的香草导航或表单提交时,此事件也会被触发,您需要在每个“普通”链接/按钮上禁止此事件。 您还需要触发Ajaxical请求以通知服务器有关关闭的信息,因为您无法更改页面位置或提交隐藏的表单,因为浏览器将被关闭。
为什么要删除属性。 实际上,当会话无效时,无论如何都会收集垃圾,因为没有引用。 在这种情况下,您可能希望使用低超时。
如果您想立即使会话无效。 您可以随时使用JavaScript函数将请求发布到您的服务器,只需单击“确定”按钮即可。 这可能不是一件非常可靠的事情,但作为一种设施不会受到伤害。 下面是一个示例代码,
JavaScript函数
function show_confirm() { var r=confirm("Are you sure you want to abort the session?"); if (r==true) { // set an appropriate form action and document.form.submit(); } }
HTML
[在您的评论后编辑]
因此,您希望将按钮绑定到bean方法,您必须使用CSS和JavaScript执行自定义操作。 看看本教程 ,它将为您提供有关如何创建自定义弹出窗口的一些见解。 因为它只是一个普通的
,你就像其他任何按钮一样,这里没有火箭科学,只需将你的按钮代码放在
。
您可以使用MyFaces Orchestra在自定义conversation.access
和conversation.manual
定义bean。 与在会话中存储bean相比,它们最近会允许删除bean。
- 您可以为会话定义超时,该超时与会话超时不同(且更小)。
- 如果使用
conversation.access
,您的bean将在用户请求不再引用后立即删除 – 即会话已结束。 这不适用于您的情况(关闭浏览器),但仍然很好知道。
对话是由属于相同逻辑上下文的用户执行的步骤序列 – 即整个注册过程是一个对话,尽管它跨越多个页面。
通常,您不必担心用户关闭会话后剩余的内容。 它最终将被计时和垃圾收集。 你必须担心他在浏览时会话中的内容,因为它会变得非常大。
在JSF中,你会做出类似的东西
JSF页面:
使用Javascript:
//in case the user clicked No, this method should return false, //preventing the action from being submitted, but double check all the return values first function showConfirmClose(){ var c = confirm("Are you sure?"); return c; }
BackBean:
public void cleanUpMethod(ActionEvent event){ //do cleaning here }