2011-11-21 39 views
1

我想用戶會話支持添加到我的應用程序。由於重新加載頁面將重新啓動應用程序,甚至打開另一個瀏覽器選項卡將導致原來的'不同步'問題。如何支持用戶會話Vaadin項目

我是否需要爲每個登錄一個獨立的窗口,或者是有任何的插件,我可以使用,或者,如果我讓一個Spring + Vaadin的應用程序,它會解決這個問題?

回答

4

重新加載頁面應該不是重新啓動應用程序,除非您的網址以?restartApplication=true結尾。

的應用對象存儲在HTTP會話中,因此,你要每個用戶存儲可以與應用程序相關聯的一切。

通常,每個瀏覽器進程只能支持一個HTTP會話,因此每個瀏覽器只能支持一個用戶(除非您花費大量精力,並在每個應用程序級別的窗口中存儲每個用戶的狀態。除非你知道你在做什麼,否則不要這樣做:一個用戶per-http-session是web應用程序中的常態)

Spring + Vaadin是一個很好的組合 - 我正在使用這個配對,項目 - 但在這方面並不特別有用。

Vaadin不支持多窗口/標籤在它的默認配置(因此你出的同步誤差)。但是,編寫代碼很簡單:here's a simple explanation, and some code

+0

@charlesmy問題是我添加了一個closeListener到窗口。 ((WebApplicationContext)getContext())。getHttpSession()。invalidate();以便每次重新加載頁面時,會話都會過期。謝謝 –

5

使用Vaadin Framework創建的應用程序會自動處於有狀態,因此您的應用程序應保持其狀態,除非您在URL中具有?restartApplication參數。

爲了支持multible瀏覽器標籤/在同一個會話窗口中,getWindow(字符串名稱)必須在應用程序類中重寫返回一個新的窗口實例對每個瀏覽標籤/窗口:

@Override 
public Window getWindow(String name) { 

    // If the window is identified by name, we are good to go 
    Window w = super.getWindow(name); 

    // If not, we must create a new window for this new browser window/tab 
    if (w == null) { 
     w = new CalcWindow(); 

     // Use the random name given by the framework to identify this 
     // window in future 
     w.setName(name); 
     addWindow(w); 

     // Move to the url to remember the name in the future 
     w.open(new ExternalResource(w.getURL())); 
    } 

    return w; 
} 

對於有關Vaadin的多窗口支持的更多信息,請參閱this wiki page

+0

我用你提供的方法。但我收到錯誤信息從127.0.0.1收到無效安全密鑰?你知道爲什麼嗎? –

+0

@henriI發現問題。我在一個瀏覽器中打開了相同的應用程序,但是不同的標籤,但是如果我在兩個瀏覽器中打開。它沒有問題。謝謝。 –