使用Google App Engine在开发模式下进行会话持久性

时间:2012-05-21 17:41:22

标签: google-app-engine gwt httpsession

我在App Engine中enabled sessions,在部署应用程序时效果非常好。我的问题是,这似乎不适用于开发模式。我需要在开发模式下将某些内容(磁盘,数据存储区,内存)持久化,以便每次重新启动本地服务器时都不必登录我的应用程序(每次我更改服务器或共享代码时) 。

我通常通过在jetty-web.xml中定义HashSessionManager来实现这一点,但出于安全原因,显然(并且可以理解)App Engine explicitly disables配置文件。

有没有人知道在App Engine中实现本地会话持久性的标准方法,假设存在一个?

我在appengine-web.xml中有以下相关行:

  <sessions-enabled>true</sessions-enabled>
  <async-session-persistence enabled="true" />

我正在使用App Engine SDK的1.6.5版(最新版)。

以下是我采取的一些步骤:

在扩展RemoteServiceServlet的服务器端类中,我添加了以下行:

public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
    // Added this line
    System.out.println(request.getSession().getCreationTime());
    ...
}

我重新启动了开发模式服务器,加载了我的应用程序并为我的应用程序发出的每个请求获得了“1337796704817”,表明请求之间正在使用相同的会话。然后,我重新启动开发模式服务器,下一个请求生成“1337796798184”,表示已创建新会话。

如下所述,我正在使用Google Cloud SQL,并且我已在应用引擎设置中禁用了数据存储选项,但这在部署时似乎不会导致任何问题。此外,我尝试了上述相同步骤并检查了这些选项,并得到了相同的结果。

2 个答案:

答案 0 :(得分:0)

会话将持久保存到数据存储区。只要您每次重新启动dev_appserver都没有清除数据存储区,您的会话就应该保留。检查每次重新启动时是否清除数据存储区。

答案 1 :(得分:0)

如果您设置了cookie_args.domain值(如Webapp2 Sessions中所述),那么它将无法在您的开发服务器上运行。也就是说,如果域名设置为.mydomain.com,那么它将无法从您的开发服务器localhost:8000开始工作。

例如,如果您的main.py包含这样的配置对象:

config = {
    'webapp2_extras.sessions': {
        'secret_key': '**secret_key**',
        'cookie_args': {'domain': '.mydomain.com', 'httponly': True}
    }
}

解决方案是编写一些条件代码:

import os
domain = None if os.environ['SERVER_SOFTWARE'].startswith('Development') else '.mydomain.com'

config = {
    'webapp2_extras.sessions': {
        'secret_key': '**secret_key**',
        'cookie_args': {'domain': domain, 'httponly': True}
    }
}
WSGIApplication(Routing, config=config, debug=True)