【问题标题】:JSF: Clearing Session Scoped BeanJSF:清除会话作用域 Bean
【发布时间】:2011-01-06 05:32:51
【问题描述】:

我想知道,在 JSF 1.2 上用户关闭窗口(点击浏览器的“X”)后,我将如何在 JSF 中执行 session.remove("userBean")

我想在用户点击浏览器的“X”后弹出一个确认消息,但不太确定如何访问或绑定Ok 按钮到我定义的方法,我有该逻辑来清除作用域 bean .或者有什么更好的方法吗?

任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: java session jsf


    【解决方案1】:

    我想知道,当用户在 JSF 1.2 上关闭窗口(点击浏览器的“X”)后,我将如何在 JSF 中执行 session.remove("userBean")。

    您无需担心。如果会话超时,那么 bean 肯定会被删除。如有必要,您可以在web.xml 中控制<session-config> 中的会话超时时间。如果你真的想钩住会话超时/销毁,那么你可以只实现HttpSessionListener并在sessionDestroyed()上拦截,或者让UserBean实现HttpSessionBindingListener并在valueUnbound()上拦截。

    如果你真的坚持要监听浏览器关闭按钮,毕竟这需要更多的工作,那么你所能做的就是使用 Javascript 的beforeunload 事件。没有其他方法。您只应记住,这是一个非标准事件,因此并非所有网络浏览器都支持。例如。 Opera 不支持此事件。简化这项工作是一项艰巨的工作,因为当您执行普通导航或表单提交时也会触发此事件,您需要在每个“正常”链接/按钮上禁止此事件。您还需要触发 Ajaxical 请求以通知服务器关闭,因为您无法再更改页面位置或提交隐藏表单,因为浏览器将要关闭。

    【讨论】:

      【解决方案2】:

      您可以使用MyFaces Orchestra 在自定义conversation.accessconversation.manual 中定义您的bean。它们将允许您的 bean 在最近被删除,而不是它们存储在会话中。

      • 您可以为会话定义一个超时,该超时不同于会话超时(并且更小)。
      • 如果使用conversation.access,您的 bean 将在用户请求不再引用它们后立即被删除 - 即对话已经结束。这不适用于您的情况(关闭浏览器),但仍然很高兴知道。

      对话是属于同一逻辑上下文的用户执行的一系列步骤 - 即整个注册过程是一个对话,尽管它跨越多个页面。

      通常,您不必担心用户关闭会话后会话中还剩下什么。它最终会超时并被垃圾收集。您必须担心他浏览时会话中的内容,因为它可能会变得非常大。

      【讨论】:

        【解决方案3】:

        为什么要删除属性。事实上,当会话失效时,无论如何都会进行垃圾收集,因为没有引用。在这种情况下,您可能希望使用较低的超时时间。

        如果您想立即使会话无效。您始终可以使用 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

        <input type="button" onclick="show_confirm()" value="Show confirm box" />
        

        [在您的 cmets 之后编辑]

        因此,您想将按钮绑定到您的 bean 方法,您必须使用 CSS 和 JavaScript 进行自定义操作。查看this tutorial,它将为您提供一些有关如何创建自定义弹出窗口的见解。因为它只是一个普通的&lt;div&gt;,所以你可以像任何其他按钮一样进行操作,这里没有火箭科学,只需将你的按钮代码放入 &lt;div&gt;

        【讨论】:

        • 如何使用 JavaScript 函数将请求发布到我的服务器,单击“确定”按钮。您能否提供一些示例,因为我是新手。谢谢,
        • 我的意思是你可以使用确认框。请参阅我的附录。
        • 但是我不能将 ok 按钮绑定到我的 bean 类方法,我的意思是不是 javaScript 方法。请建议。
        • 没有没有。至少在本机确认对话框中不是这样。
        【解决方案4】:

        在 JSF 中,您将制作类似的东西

        JSF 页面:

        <h:commandButton id="closeBtn"
              type="submit" value="Close" onclick="return showConfirmClose();" 
              actionListener="#{backBean.cleanUpMethod}"
        </h:commandButton>
        

        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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-13
          • 1970-01-01
          • 2013-03-15
          • 2011-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多