我遇到一个问题,即当有多个人登录该应用程序时,它会获取第二人的第一人的帐户详细信息。
当一个人登录时,我将他们的详细信息写入服务器端: 客户方:
//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;
}
然后我显示第一个视图“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");
}
答案 0 :(得分:2)
public ViewData getViewData() {
return viewData;
}
假设这是在RemoteServiceServlet
,这是你的问题。在普通的JavaEE服务器中,每个servlet都是一个单例 - 它只有一个实例。这意味着您的webapp上的所有用户将共享同一个实例,因此您的服务器需要找到一种更好的跟踪数据的方法,而不是在同一个servlet实例的同一个字段中。
一种可能的选择是使用HttpSession类来存储有关当前活动的每个浏览器会话的特定详细信息。这些作为HttpServletRequest对象的一部分进行跟踪,并且由于您的服务器端服务也是一个servlet,因此您可以使用它。方法getThreadLocalRequest()
将为您提供请求,您可以在会话中读取和写入数据:
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)
方法(如果当前客户端尚不存在),但getSession()
不会尝试创建会话,而是坚持必须已经存在才能完成其工作。还要确保使您的属性键唯一,因为此会话将与此webapp中的所有其他servlet共享。通常,开发人员将使用servlet类名称为密钥添加前缀。
此数据当然仅在会话期间存在,具体取决于已配置的时间长度 - 它可能与浏览器退出或服务器重新启动一样短。要长期保存数据,请考虑将数据存储在某种数据库中(远远超出单个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;
}