Google App Engine在开发模式下的会话持久性

我已在App Engine中启用会话,该功能非常适用于该应用程序已部署。我的问题是,这似乎不适用于开发模式。我需要在开发模式下将某些会话(磁盘,数据存储区,内存)保存到某个位置,以便每次重新启动本地服务器时都不必登录到我的应用程序(每次我对服务器或共享代码进行更改时) 。

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

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

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

  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
额外 编辑
意见: 1

2 答案

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

0
额外
所以你说,只要我不会在启动时清除数据存储区,即使在开发模式下,会话也应该保留下来?目前它在部署时工作,但我已经确认开发模式会话没有写入数据存储,我也没有清除它。需要注意的一件事是,我没有使用数据存储库进行其他任何操作,我正在使用Google Cloud SQL,并且在App Engine设置中取消选中了“启用本地HRD支持”和“使用Datanucleus JDO/JPA访问数据存储区” 。
额外 作者 tangent,

如果您设置了 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)
0
额外