gpt4 book ai didi

java - 当两个人登录时,为第二个人显示第一个人的帐户详细信息

转载 作者:行者123 更新时间:2023-11-29 06:16:48 26 4
gpt4 key购买 nike

我有一个问题,当不止一个人在应用程序上签名时,它会为第二个人获取第一个人的帐户详细信息。

当有人登录时,我将他们的详细信息写入服务器端:客户端:

//Store the LoginView data for use in subsequent Views.
AsyncCallback<ViewData> callback2 = new ViewDataStoreHandler<ViewData>();
rpc.setViewData(account.getAccountId(), account.getLevel(), null, null, null, scoutGroup, null, 0, scoutGroupSection, callback2);

服务器端:

//Store and retrieve data used by Views within the application
//This allows us to securely pass parameters between Views.
private ViewData viewData = null;

public ViewData setViewData(String accountId, String accountLevel,
String ymId, String awId, String adAwardGroup, String adScoutGroup,
String caId, Integer numberOfGroupsStarted, String groupSection) {

viewData = new ViewData();

viewData.setaccountId(accountId);
viewData.setaccountLevel(accountLevel);
viewData.setymId(ymId);
viewData.setawId(awId);
viewData.setadAwardGroup(adAwardGroup);
viewData.setadScoutGroup(adScoutGroup);
viewData.setcaId(caId);
viewData.setnoGroupsStarted(numberOfGroupsStarted);
viewData.setsection(groupSection);

return viewData;
}

然后我显示第一个 View “SelectPersonView”,我使用以下方法获取存储的信息:客户端:

//On load of page get the Account Level and ID of the account holder.
AsyncCallback<ViewData> callback = new ViewDataHandler<ViewData>(SelectPersonView.this);
rpc.getViewData(callback);

服务器端:

public ViewData getViewData() {
return viewData;
}

当只有一个人登录时,这工作正常。当我有两个人登录时,第二个人登录时会显示第一个人的帐户详细信息。非常感谢您的协助。

嗨,科林,这是我实现的(一旦我确定它有效,我就会相信你):

/Store and retrieve data used by Views within the application
//This allows us to securely pass parameters between Views.
public ViewData setViewData(String accountId, String accountLevel,
String ymId, String awId, String adAwardGroup, String adScoutGroup,
String caId, Integer numberOfGroupsStarted, String groupSection) {
ViewData viewData = new ViewData();

getThreadLocalRequest().getSession(true).setAttribute("viewData", viewData);
viewData.setaccountId(accountId);
viewData.setaccountLevel(accountLevel);
viewData.setymId(ymId);
viewData.setawId(awId);
viewData.setadAwardGroup(adAwardGroup);
viewData.setadScoutGroup(adScoutGroup);
viewData.setcaId(caId);
viewData.setnoGroupsStarted(numberOfGroupsStarted);
viewData.setsection(groupSection);
return viewData;
}

public ViewData getViewData() {
return (ViewData) getThreadLocalRequest().getSession().getAttribute("viewData");
}

最佳答案

public ViewData getViewData() {
return viewData;
}

假设这是在您的 RemoteServiceServlet 中,这就是您的问题。在一个普通的 JavaEE 服务器中,每个 servlet 都是一个单例——它只有一个实例。这意味着您的 webapp 上的所有用户将共享同一个实例,因此您的服务器需要找到一种比在同一个 servlet 实例的同一个字段中跟踪数据更好的方法。

一个可能的选择是使用 HttpSession类来存储有关当前 Activity 的每个浏览器 session 的特定详细信息。它们作为 HttpServletRequest 对象的一部分进行跟踪,并且由于您的服务器端服务也是一个 servlet,因此您可以使用它。 getThreadLocalRequest() 方法会给你请求,你可以在 session 中读取和写入数据:

public void setViewData(viewDataFromClient) {
getThreadLocalRequest().getSession(true).setAttribute("key-goes-here", new ViewData());

//...

public ViewData getViewData() {
return (ViewData) getThreadLocalRequest().getSession().getAttribute("key-goes-here");
}

您可能想要进一步清理它,但这是一个起点。请注意 getSession(true) 方法,如果当前客户端尚不存在 session ,该方法会创建一个 session ,但 getSession() 不会尝试创建它,而不是坚持它必须已经存在才能完成它的工作。还要确保您的属性键是唯一的,因为此 session 将与此 web 应用程序中的所有其他 servlet 共享。开发人员通常会在键前加上 servlet 类名。


当然,此数据只会在 session 期间存在,具体取决于配置的时间长度 - 可能与浏览器退出或服务器重新启动一样短。为了长期保存您的数据,考虑将数据存储在某种数据库中(远远超出单个 StackOverflow 答案的范围...)。


回复编辑:

添加的代码并没有真正解决问题 - 您仍然有一个共享字段,所有客户端都将尝试读取和写入,因此它们会破坏彼此的更改

//Store and retrieve data used by Views within the application
//This allows us to securely pass parameters between Views.
private ViewData viewData = null;

public ViewData setViewData(String accountId, String accountLevel,
String ymId, String awId, String adAwardGroup, String adScoutGroup,
String caId, Integer numberOfGroupsStarted, String groupSection) {
getThreadLocalRequest().getSession(true).setAttribute
(accountId, new ViewData());
viewData.setaccountId(accountId);
viewData.setaccountLevel(accountLevel);
viewData.setymId(ymId);
viewData.setawId(awId);
viewData.setadAwardGroup(adAwardGroup);
viewData.setadScoutGroup(adScoutGroup);
viewData.setcaId(caId);
viewData.setnoGroupsStarted(numberOfGroupsStarted);
viewData.setsection(groupSection);
return viewData;
}

不要使用字段 viewData,除非您期望所有用户看到相同的对象。

相反,请考虑以下代码,其中 ViewData 是局部变量:

public ViewData setViewData(String accountId, String accountLevel,
String ymId, String awId, String adAwardGroup, String adScoutGroup,
String caId, Integer numberOfGroupsStarted, String groupSection) {
//create a view data object with the specific details
ViewData viewData = new ViewData();

viewData.setaccountId(accountId);
viewData.setaccountLevel(accountLevel);
viewData.setymId(ymId);
viewData.setawId(awId);
viewData.setadAwardGroup(adAwardGroup);
viewData.setadScoutGroup(adScoutGroup);
viewData.setcaId(caId);
viewData.setnoGroupsStarted(numberOfGroupsStarted);
viewData.setsection(groupSection);

//store the data in the session so we remember it when the user comes back
getThreadLocalRequest().getSession(true).setAttribute(accountId, viewData);

//return the viewdata to the user
return viewData;
}

关于java - 当两个人登录时,为第二个人显示第一个人的帐户详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35421813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com