Google app engine 最终的静态变量在谷歌应用程序引擎云中重置

Google app engine 最终的静态变量在谷歌应用程序引擎云中重置,google-app-engine,authentication,Google App Engine,Authentication,我有一个GWT+GAE web应用程序,其中包含多个服务和模块。我正在使用的模块功能。我的所有服务包括: public abstract class BaseServiceImpl extends RemoteServiceServlet { protected final static Map USERS = new HashMap(); 我使用用户存储我当前的活动用户会话。一旦我的用户验证了自己,我就会将他的会话id存储为映射的密钥 protected String getSession

我有一个GWT+GAE web应用程序,其中包含多个服务和模块。我正在使用的模块功能。我的所有服务包括:

public abstract class BaseServiceImpl extends RemoteServiceServlet {
 protected final static Map USERS = new HashMap();
我使用用户存储我当前的活动用户会话。一旦我的用户验证了自己,我就会将他的会话id存储为映射的密钥

protected String getSessionId() {
    return getThreadLocalRequest().getSession().getId();
}

public String authenticate(String username, String password) {
    ...
    ..
    .
   String id = getSessionId();
   synchronized( this ) {    
       users.put(id, user);
   } 
   ...
   ..
   .
对于每个请求,我检查用户会话是否仍然有效

protected boolean validUserSession() {  
    if(getThreadLocalRequest() == null) {
     logger.log(Level.SEVERE, "Thread is null");
     return false;
 } else if(getThreadLocalRequest().getSession() == null) {
     logger.log(Level.SEVERE, "Session is null");
     return false;
 }
 String id = getSessionId();
 UserJDO user = (UserJDO) users.get(id);
 if(user==null) {   
     logger.log(Level.SEVERE, "User is null");
     return false;
 }
 return true;
}
我已启用会话。接下来我发布appengine-web.xml的最后几行

...
..
.
<sessions-enabled>true</sessions-enabled>
</appengine-web-app>
。。。
..
.
符合事实的
在开发服务器中一切正常。但是,当我将其部署到google app engine云时,每个请求的用户变量都会重置。


有人能解释一下发生了什么事吗?我应该如何进行?是否应将用户会话存储在数据存储中?

在GAE中,每个请求可能会命中不同的服务器。此外,您的应用程序可能会在每次请求之前取消部署并重新部署。您不应该依赖静态变量。将状态保存在会话或数据库中

这里是引自

App Engine使用多个web服务器运行应用程序,并自动调整用于可靠处理请求的服务器数量。给定的请求可以路由到任何服务器,并且它可能不是处理来自同一用户的前一个请求的同一服务器


一旦启动,它们将在请求结束时自动存储到数据存储中。

在GAE中,每个请求可能会命中不同的服务器。此外,您的应用程序可能会在每次请求之前取消部署并重新部署。您不应该依赖静态变量。将状态保存在会话或数据库中

这里是引自

App Engine使用多个web服务器运行应用程序,并自动调整用于可靠处理请求的服务器数量。给定的请求可以路由到任何服务器,并且它可能不是处理来自同一用户的前一个请求的同一服务器


一旦启动,它们将在请求结束时自动存储到数据存储中。

Google App Engine可能会在不同的服务器上运行每个请求。它们不保证请求由同一台机器上的同一个VM实例提供服务。您需要将用户信息存储在持久性存储中,例如BigTable表。

Google App Engine可能会在不同的服务器上运行每个请求。它们不保证请求由同一台机器上的同一个VM实例提供服务。您需要将用户信息存储在持久性存储中,例如BigTable表。

要正确使用会话,只需将数据放入会话中即可。例如,“session.setAttribute(“某个键”,myData)。您可以使用getAttribute(“某个键”)检索它。您的数据必须可序列化。您不应该基于内存中的sessionID创建自定义映射。要正确使用会话,只需将数据放入其中。例如,“session.setAttribute(“某个键”,myData)。您可以使用getAttribute(“某个键”)检索它。您的数据必须可序列化。您不应该基于内存中的sessionID创建自定义映射。