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