2

我在 App Engine 中启用了会话,在部署应用程序时效果很好。我的问题是这似乎在开发模式下不起作用。我需要一些东西来在开发模式下的某个地方(磁盘、数据存储、内存)保持会话,这样我就不必每次重新启动本地服务器时都登录我的应用程序(每次更改服务器或共享代码时) .

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

有没有人知道在 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,并且在应用引擎设置中禁用了数据存储选项,尽管这在部署时似乎不会导致任何问题。此外,我在检查这些选项的情况下尝试了上述相同的步骤,并得到了相同的结果。

4

2 回答 2

0

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

于 2012-05-22T01:55:08.003 回答
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)
于 2016-05-07T02:40:04.750 回答