1

我们有几个用户可以登录的web应用程序。在点击注销按钮时,必须处理一些逻辑。问题是大多数用户关闭浏览器而不点击注销按钮。我试图通过以下方式在浏览器关闭时调用我的逻辑:JSF p:remotecommand和javascript事件onbeforeunload

  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" /> 

回答

0

您是否特别需要客户端JavaScript解决方案,或者仅仅是您到目前为止的方式?

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

如果你编写了一个方法,它带有这个注解,当用户离开你的页面而不点击注销时,它将被调用。

辅助Bean:

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> 
+0

我目前的情况是,我必须在注销时发布请求的许可证。我们的会话超时时间为30分钟,但许可证必须在用户离开应用程序后直接释放。我不确定,但我认为@PreDestroy解决方案只在会话过期时才起作用? – 2012-07-25 10:47:06

+0

为你增加了一个例子:-) – 8bitjunkie 2012-07-25 12:46:05

+0

是的,我明白你的意思了 - 我的道歉,@PreDestroy需要会话被销毁才能触发。融合这两种方法,通过类似PrimeFaces RemoteCommand(http://www.primefaces.org/showcase/ui/remoteCommand.jsf)的方式将Session调用(在body unload上)调用到Session destroy方法中,可以让您立即使用户的会话(http://www.coderanch.com/t/384874/java/java/destroying-session-when-user-closes),并导致许可证撤销方法触发。 – 8bitjunkie 2012-07-25 13:02:12