2011-04-22 129 views
1

你好全部 我正在gwt-ext應用程序上工作。在服務器端我使用Hibernate。 我在服務器端保持會話。它的超時時間是5分鐘(在操作類中)。gwt應用程序客戶端的會話管理

現在我們來看一個登錄&的用戶保持打開5分鐘的時間。五分鐘過期後,點擊屏幕上的一個按鈕。客戶端有一些進程&它是2分鐘之後,它將用於服務器調用。當它用於服務器調用時,它已經處於會話狀態(因爲會話時間是5分鐘,已經過期)。並且會彈出一個會話消息,重定向登錄頁面。

在這種情況下,用戶覺得我在系統上很活躍(實際上在客戶端5分鐘後),爲什麼我被重定向到登錄頁面。

背後的原因是會話在服務器端維護,服務器命中是在七分鐘後。

所以我想在客戶端也保留會話也如何在基於gwt的應用程序中實現這一點。 有沒有其他辦法可以解決這個問題。 感謝所有。

回答

2

一種方法是定期檢查服務器是否發生超時。您將不得不編寫一個servlet方法來執行該檢查,而不會更新服務器會話超時!當然這會導致很多服務器命中。 (不一定是壞的方法雖然!)


但是,也許我會用一個dfifferent解決方案,它試圖保持一個計時器在客戶端與服務器的定時器,例如大約同步

客戶端:

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); 
    } 
} 

我假設你的服務器會話超時被更新的每一個客戶端執行與服務器,例如交互時間一個GWT-RPC調用(如果該會話還沒有超時)。

所以在客戶端,然後,我會還更新客戶端計時器,以保持它的大致同步:

myService.performSomeAction(...) { 

    @Override 
    public void onSuccess(String result) { 

      ClientTimers.renewSessionTimer(); 

      // remaining onSuccess handling 
    } 

    @Override 
    public void onFailure(Throwable caught) { 

      if (failedBecauseOfSessionTimeout()) { 

       // redirect to login 

      } else { 

       ClientTimers.renewSessionTimer(); 

       // remaining onFailure handling... 
      } 
    } 
} 

不要忘記尤其是直接調用後renewSessionTimer()上的所有交互(登錄)。

重要說明:對於所有安全檢查,僅使用服務器會話。客戶端「會話計時器」僅爲用戶提供便利。不要根據該定時器或任何類型的客戶端會話進行安全/授權檢查。

1

考慮到用戶點擊屏幕上的按鈕時的場景。你可以打一個服務器並檢查會話是否存在。

讓我知道,如果我得到的情況與否。

0

做得到的每一頁事件我都沒有這個....它工作正常。

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"); 
      } 
     }); 
1

該代碼會在超時發生時自動註銷。對於我的代碼,我希望在點擊或鍵入時它應該註銷。 大小寫如下:如果用戶登錄並且註銷時間爲5分鐘。用戶不按照上述代碼在屏幕上執行任何活動,則會在完成5分鐘後自動註銷。

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

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