避免在 servlet 之间共享静态变量
Avoid sharing static vars among servlets
我已经在 servlet 中使用静态变量实现了整个网站。像这样
public class UserData extends HttpServlet {
public static String fisrtName;
public static String lastName;
public static String id;
...
我在使用 servlet 方面绝对是新手,如果这个问题看起来太愚蠢了,我很抱歉。
无论如何,我现在的问题是,当一个用户连接时,其他可能连接的用户会直接获得第一个用户提供的所有数据。
我需要一些方式来说明所有这些静态变量不能在连接之间共享。
请告诉我最简单的方法,因为项目快完成了,到目前为止我还没有意识到这个巨大的陷阱。
谢谢。
您应该将这些数据放入会话中,例如 session.putValue("firstName",name)
并使用 session.getValue("firstName")
来检索它们。
会话对象不会在不同的会话中共享,不同的用户有不同的会话。您不必担心它们会在不同用户之间共享。
正如@haoyu wang 所建议的那样,session 是一个好地方,但是将所有字段收集到一个 class(例如实例不是静态变量):
public class UserInfo{
public String fisrtName;
public String lastName;
public String id;
...
}
然后 set/retrieve 作为一个单元,以便您可以更轻松地将用户信息传递给 servlet 的其他组件:
UserInfo info = session.getAttribute("userinfo");
if (info == null) {
userinfo = new UserInfo();
... fill in fields / validate
session.setAttribute("userinfo", userinfo);
}
请注意,getValue 和 putValue 已弃用,因此应改用 getAttribute / setAttribute。
我已经在 servlet 中使用静态变量实现了整个网站。像这样
public class UserData extends HttpServlet {
public static String fisrtName;
public static String lastName;
public static String id;
...
我在使用 servlet 方面绝对是新手,如果这个问题看起来太愚蠢了,我很抱歉。
无论如何,我现在的问题是,当一个用户连接时,其他可能连接的用户会直接获得第一个用户提供的所有数据。
我需要一些方式来说明所有这些静态变量不能在连接之间共享。
请告诉我最简单的方法,因为项目快完成了,到目前为止我还没有意识到这个巨大的陷阱。
谢谢。
您应该将这些数据放入会话中,例如 session.putValue("firstName",name)
并使用 session.getValue("firstName")
来检索它们。
会话对象不会在不同的会话中共享,不同的用户有不同的会话。您不必担心它们会在不同用户之间共享。
正如@haoyu wang 所建议的那样,session 是一个好地方,但是将所有字段收集到一个 class(例如实例不是静态变量):
public class UserInfo{
public String fisrtName;
public String lastName;
public String id;
...
}
然后 set/retrieve 作为一个单元,以便您可以更轻松地将用户信息传递给 servlet 的其他组件:
UserInfo info = session.getAttribute("userinfo");
if (info == null) {
userinfo = new UserInfo();
... fill in fields / validate
session.setAttribute("userinfo", userinfo);
}
请注意,getValue 和 putValue 已弃用,因此应改用 getAttribute / setAttribute。