首页 > 解决方案 > Google App Engine 会话丢失属性

问题描述

我有一个存储会话授权详细信息的应用程序,它已经工作了多年,现在会话属性返回 null。我在每个请求开始时检索会话数据,并在返回响应之前设置它。该应用程序是在 GAE 标准上运行的 Spring 3 MVC。

会话已启用,<sessions-enabled>true</sessions-enabled>. 我所有的对象都实现了可序列化。更新- 在检查项目历史时,我最近升级到 Java 8。我恢复到 Java 7,并且会话在设置后仍然返回 null 属性。设置回 Java 8。

protected void setSessionAccess(HttpServletRequest request, Access access) {
    logger.info("setting session access...");
    request.getSession().setAttribute(ACCESS, access);
}

protected Access getSessionAccess(HttpServletRequest request) {
    logger.info("getting session access...");
    Access access = (Access) request.getSession().getAttribute(ACCESS);
    if (access == null) {
        logger.log(Level.WARNING, "access is null, initializing access...");
        access = new Access();
    }
    return access;
}

在进行故障排除时,我添加<async-session-persistence enabled="true" />并删除了它,因为会话数据也用于导航目的。

更新- 用户报告他们能够与某些浏览器/平台而不是其他浏览器/平台保持会话,这让我相信这是与 cookie 相关的。当我禁用会话 cookie 时,我可以重复该问题。URL 重写会解决这个问题,但为什么会突然中断呢?

任何帮助是极大的赞赏!

标签: javagoogle-app-engine

解决方案


可能与我在 Python/Flask 中开发无关,但由于我错误地将应用程序“密钥”设置为在每个实例上随机生成的东西,我正在失去我的会话。这意味着当用户从一个实例转移到另一个实例时,会话无法被访问,因为每个实例都有不同的密钥来签署 cookie/会话。


推荐阅读