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

时间:2016-02-16 00:53:25

标签: java mysql gwt

我遇到一个问题,即当有多个人登录该应用程序时,它会获取第二人的第一人的帐户详细信息。

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

//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");
}

1 个答案:

答案 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;
}