2013-08-07 80 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