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.accessconversation.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 }