1

我们有几个用户可以登录的 Web 应用程序。单击注销按钮时,必须处理一些逻辑。问题是大多数用户没有点击注销按钮就关闭了浏览器。我尝试了以下方法在浏览器关闭时调用我的逻辑:

  1. 将事件“onbeforeunload”添加到我的框架集中。在浏览器关闭时,将调用注销功能。
  2. 在我的注销功能中,我使用 primefaces p:remoteCommand 组件来调用服务器上的操作侦听器。

在当前的 Firefox 版本中,一切正常,但 IE9 有一些问题。在 IE9 中关闭选项卡调用我的逻辑。关闭浏览器不起作用。调用了我的 JS 函数,但未执行对服务器的请求。有没有办法解决这个问题?顺便说一句:我知道这不是一个 100% 的解决方案,但我们确实需要这个功能。我的函数和 p:remoteCommand 看起来像这样。

function automaticLogout() {
    handleAutomaticLogout();
    alert('BlaBla');
}

<p:remoteCommand name="handleAutomaticLogout" actionListener="#{myBean.handleAutomaticLogout}" async="false" />
4

2 回答 2

0

您是否特别需要客户端 Javascript 解决方案,或者这只是您目前采用的方式?

在服务器端,在 Backing Bean 方法上方放置@PreDestroy注释会导致该方法在 Bean 超出范围之前被调用。

如果您使用此注释编写使会话( session.invalidate()) 无效的方法,则当用户离开您的页面而不单击注销时将调用该方法。

支持豆:

import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

@ManagedBean
@SessionScoped
public class PreDestroyBean {

    //Called by button - log out perhaps?
    public void killTheSessionDeliberately() {
        HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
        session.invalidate();
    }

    @PreDestroy
    public void revokeLicense() {
        System.out.println("PreDestroy method was called.");

    }
}

页面按钮:

<h:form>
    <p:commandButton id="killSession" value="Kill Session" 
            actionListener="#{preDestroyBean.killTheSessionDeliberately()}" update="@form" />
</h:form>
于 2012-07-24T21:36:37.073 回答
0

您可以将 p:remoteCommand 与 onunload 一起使用。例子:

<body onunload="test();"> 
    <form id="exit">
       <p:remoteCommand  id="test" name="test" action="#{ContatoMB.teste}"/>
    </form>
</body>

引用http://forum.primefaces.org/viewtopic.php?f=3&t=15695 它对我有用。

于 2016-06-24T15:07:54.350 回答