2011-04-29 93 views
0

我正在使用GWT-ext應用程序。 在這個應用程序中,我管理客戶端會話。爲此我寫下面的代碼:gwt中的會話管理

管理會話: import com.google.gwt.user.client.Timer;

public class ClientTimers { 

    private static final Timer SESSION_MAY_HAVE_EXPIRED_TIMER = new Timer() { 

     @Override 
     public void run() { 
      // Warn the user, that the session may have expired. 
      // You could then show a login dialog, etc... 
     } 
    }; 

    public static void renewSessionTimer() { 

     // First cancel the previous timer 
     SESSION_MAY_HAVE_EXPIRED_TIMER.cancel(); 

     // Schedule again in 5 minutes (maybe make that configurable?) 
     // Actually, let's subtract 10 seconds from that, because our timer 
     // won't be synchronized perfectly with the server's timer. 
     SESSION_MAY_HAVE_EXPIRED_TIMER.schedule(5 * 60 * 1000 - 10000); 
    } 
} 

要獲取用戶活動:

Ext.get("pagePanel").addListener("click", new EventCallback() { 
     @Override 
     public void execute(EventObject e) { 
      //MessageBox.alert("On Mouse Click"); 
    }); 

    Ext.get("pagePanel").addListener("keydown", new EventCallback() { 

     @Override 
     public void execute(EventObject e) { // 
      //MessageBox.alert("On Key Press Click"); 
     } 
    }); 

此代碼工作正常,但我的問題: 此代碼將做自動的時間登出了occurs.For我的代碼我想上點擊或鍵入它應該註銷。情況是這樣的:如果用戶登錄並且註銷時間是5分鐘。用戶不按照上述代碼在屏幕上執行任何活動,它將在5分鐘完成時自動註銷。

現在我的要求是,如果用戶登錄,它不會做任何事情5分鐘。它不應該做任何註銷自動。而不是完成5分鐘註銷,如果用戶請點擊或鍵下降6分鐘,然後它應該做註銷過程。

基本上,作爲計時器超過指定時間的註銷過程應該在用戶活動上完成,而不是自動完成。

回答

2

在計時器中,每秒增加一個變量。 當用戶在5分鐘或第6分鐘後點擊任何按鈕時,檢查計數器變量,如果變量大於6,則可以使用Window.Location.reload();註銷或重新加載()。

1

我想你Searchin的的事情是:

Window.Location.reload();

用定時器每隔幾秒就會觸發一次,所以用戶總是活躍起來。

(順便說一句我有一個從Window close issues in gwt -ext

0

上覆蓋整個區域的無形DIV安裝一個JavaScript事件處理程序。如果它得到一個事件,發送一個AJAX請求到服務器。

服務器可以做任何需要做的事情。在客戶端,您可以等待來自AJAX請求的回覆並顯示「您已註銷」。

這種方法有一個缺點:存儲在會話中的對象會長時間保持活動狀態。因此,即使用戶從未註銷並離開(或他的瀏覽器崩潰),該會話仍會保持活動狀態。

幾天後,會有很多死機會累積起來,導致服務器崩潰。

因此,更好的解決方案是自動註銷用戶,因爲您已經在上安裝AJAX事件處理程序,以便在用戶返回到瀏覽器時顯示消息。

這樣,您的服務器可以清理死亡會話,並且當用戶可以讀取它時(當他在屏幕前)時,用戶會收到一條消息。

請注意,您不能區分用戶和清潔團隊敲擊鼠標。