我在GWT应用程序中发现一个问题,当我使用一个用户打开两个GWT客户端并调用相同的服务器方法时,一个客户端获取的数据与另一个客户端的数据相同,但这是错误的。 如何避免这个问题。
例如: 我打开一个页面做加上计算1 + 1并从服务器方法add()得到答案,同时,我打开另一个页面做加上计算2 + 2并从同一服务器方法得到答案,我得到了同样的答案1 + 1 = 2和2 + 2 = 2。 我的英语不够清楚地描述这个问题 顺便说一句,我使用全局变量将数据存储在servlet中。
另一个例子:
public class ConfigServiceImpl extends GwtConfigController implements ConfigService {
private String serviceInstanceId = "";
public String testConnection() {
if(serviceInstanceId.trim().length() > 0){
return "error : serviceInstanceId";
}
serviceInstanceId = "test";
return serviceInstanceId;
}
}
在我的客户端窗口小部件init中,调用testConnection。 我打开两页进行测试,第一页,返回“test”,第二次返回错误信息。
答案 0 :(得分:0)
您应该编写一个调用方法的servlet,并测试错误是否真的来自客户端:我很确定这是因为您的服务器上的代码:每个网页都有自己的javascript变量,有无法让客户端的两个实例共享变量:就好像我可以通过javascript从用户的打开页面窃取数据(这将是一个严重的安全问题)
答案 1 :(得分:0)
你不应该在全局变量(servlet类中的成员?)中存储服务器端的数据。将数据存储在数据库中或(更容易)将其存储在sessions中。因此,数据是特定于用户的,不会在不同用户之间共享:
@Override
public void add(int a, int b) {
HttpServletRequest request = this.getThreadLocalRequest();
HttpSession session = request.getSession();
int result = a + b;
session.setAttribute("aNameForTheValue", result); }
@Override
public void otherMethod()
{
HttpServletRequest request = this.getThreadLocalRequest();
HttpSession session = request.getSession();
int addResult= (int) session.getAttribute("aNameForTheValue");
...
}