【问题标题】:Session persistence in development mode with Google App Engine使用 Google App Engine 开发模式下的会话持久性
【发布时间】:2012-05-28 05:33:29
【问题描述】:

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

【问题讨论】:

    标签: google-app-engine gwt httpsession


    【解决方案1】:

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

    【讨论】:

    • 所以你的意思是,只要我在启动时不特意清除数据存储,即使在开发模式下会话也应该保持不变?目前它在部署时可以工作,但我已经确认没有将开发模式会话写入数据存储,并且我没有将其清除。需要注意的一点是,我没有将数据存储用于其他任何事情,我使用的是 Google Cloud SQL,并且在 App Engine 设置中未选中“启用本地 HRD 支持”和“使用 Datanucleus JDO/JPA 访问数据存储” .
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 2013-05-02
      • 1970-01-01
      • 2011-12-25
      • 2018-12-03
      • 1970-01-01
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多