Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多个用户登录的Wicket会话_Java_Apache_Session_Wicket - Fatal编程技术网

Java 多个用户登录的Wicket会话

Java 多个用户登录的Wicket会话,java,apache,session,wicket,Java,Apache,Session,Wicket,我正在用Wicket构建我的第一个Java应用程序,但Wicket会话有点问题 我的问题是:当第二个用户登录到应用程序时,他会覆盖第一个用户的会话->两个用户现在都在处理第二个会话。尽管两个用户在登录时都创建了一个新会话 我的代码: WicketSession.java: public class WicketSession extends WebSession { private UserBean currentUser; public WicketSession(R

我正在用Wicket构建我的第一个Java应用程序,但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);
}
以及不带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); 

将当前用户设置为新用户,并且两个登录用户相同。如何防止这个问题?

在网上搜索了很多次后,我找到了解决方案


问题是我将currentUser保存为UserBean,而不是字符串。我不知道为什么在Wicket中将用户存储为Bean不起作用,但现在终于起作用了。

为什么您认为第二个用户会覆盖会话?是否要在同一浏览器中同时登录两个用户?两个用户在不同的浏览器中工作正常。即使会话是单例的,它也只是一个局部线程变量,因此您不必担心它。为了进行测试,我使用了两个不同的浏览器,在这两个浏览器中,我与两个不同的用户登录。我使用这两种方法登录并显示用户特定的列表。当我切换到第一个用户并重新加载页面时,将显示第二个用户的列表。列表的生成方式如下:CharProxy.getInstance.getAllCharsForCurrentUserWicketSession.get.getCurrentUser;检查代码中的静态修饰符。它们通常容易发生跨会话污染。还要确保您使用的是Wicket的最新稳定版本,因为旧版本在线程本地存储清理方面存在问题,有时会将一个用户的结果泄漏到另一个用户的请求范围。我刚刚再次检查了静态修饰符,但没有发现任何问题。在我看来,当创建第二个会话时,wicket正在丢失第一个会话,即使我使用getSession.bind。还有其他人知道问题出在哪里吗?我刚刚发现会话是为每个用户保留的,只有当前用户更改为新用户。这意味着两个currentUsers是相同的。如何防止这种情况发生?请尝试使您的用户bean实现可序列化