2013-08-07 78 views
0

我正在用Wicket構建我的第一個Java應用程序,並且與Wicket會話有點問題。Wicket會話與多個用戶登錄

我的問題:當第二個用戶登錄到應用程序時,他會覆蓋第一個用戶的會話 - >兩個都在第二個會話中工作。雖然這兩個用戶創建一個新的會話在登錄時

我的代碼:

WicketSession.java:

public class WicketSession extends WebSession { 

private UserBean   currentUser; 

public WicketSession(Request request) { 
    super(request); 
} 

public static WicketSession get() { 
    return (WicketSession) Session.get(); 
} 
// getter/setter 
在我的應用程序類

@Override 
public Session newSession(Request request, Response response) { 
    return new WicketSession(request); 
} 

和登錄(短版本w/o ifs,使其可讀):

@Override 
public final void onSubmit() { 

if (signIn(wiaUsername, wiaPassword)) { 
    getSession().bind(); 
    setResponsePage(new CharListDetail()); 
} else { 
    error("Unknown username/ password"); 
} 
} 

private boolean signIn(String username, String password) { 
    currentUser = UserProxy.getInstance().getElementByUser(username, password); 
    WicketSession.get().setCurrentUser(currentUser); 
    return true;  
} 

這一切都適用於一個用戶。但是第二個用戶登錄的時刻

WicketSession.get().setCurrentUser(currentUser); 

將當前用戶設置爲新用戶並且兩個登錄用戶都是相同的。我如何防止這個問題?

+1

你爲什麼認爲第二個用戶會覆蓋會話?你想同時在同一瀏覽器中登錄兩個用戶嗎?不同瀏覽器中的兩位用戶可以正常工作。即使會話是一個單例,它只是本地線程變量,所以你不必害怕它。 –

+0

對於測試,我使用了兩個不同的瀏覽器,我用兩個不同的用戶登錄。 我使用兩者登錄並顯示用戶特定列表。當我切換到第一個用戶並重新加載頁面時,會顯示第二個用戶的列表。 該列表是這樣生成的: CharProxy.getInstance()。getAllCharsForCurrentUser(WicketSession.get()。getCurrentUser()); – Markus

+0

檢查您的代碼是否有'static'修飾符。這些通常容易造成跨部門污染。另外,請確保使用Wicket的最新穩定版本,因爲舊版本存在線程本地存儲清理問題,有時會將一個用戶的結果泄漏到另一個用戶的請求範圍中。 –

回答

0

經過大量的搜索網絡,我找到了解決方案。

問題是我將當前用戶保存爲UserBean而不是字符串。我不知道爲什麼它不能在Wicket中將用戶存儲爲Bean,但現在終於可以正常工作。

+0

試着讓你的用戶bean實現Serializable – pikand

+0

它做到了,但不幸的是它沒有這樣工作。 – Markus