【问题标题】:Google App Engine Java - Keep Session alive after users close browser (remember me function)Google App Engine Java - 用户关闭浏览器后保持会话活动(记住我功能)
【发布时间】:2011-07-08 07:38:53
【问题描述】:

我们可以通过在文件 appengine-web.xml 中将 session-enabled 设置为 true 来启用会话。但是,GAE 实现的会话在关闭浏览器后并不持久。我的问题是如何保持会话持久化,以便可以实现“记住我”功能。有许多 Python 库,但我找不到任何适用于 Java 的库。非常感谢您的帮助!

【问题讨论】:

    标签: java google-app-engine session remember-me


    【解决方案1】:

    执行此操作的常用方法是将唯一的随机密钥与您的用户相关联,将其存储在持久性 cookie 中(使用 Cookie.setMaxAge() 和您希望此 cookie 保持有效的秒数),然后将此 cookie 发送到用户。

    在 javadoc 中查找 HttpServletResponse.addCookie(向用户发送 cookie)和 HttpServletRequest.getCookies()(从客户端取回 cookie)。

    【讨论】:

    • 我知道如何在客户端设置和获取 cookie。我的问题是如何告诉 App Engine(在服务器上)我们希望它检索具有指定 ID 的会话(从 cookie 中获取此值),而不是在每次关闭浏览器并重新打开它时生成新会话。跨度>
    • GAE 以 _ah_SESSION 类型将会话状态存储在数据存储中。 AFAIK,它们还没有自动清理,所以你可以通过设置一个非常长的过期延迟来欺骗会话机制,并自己设置 JSESSIONID cookie,最大年龄不为零。
    • 太好了,你解决了我的问题!我设置了一个不同名称的 cookie(sid,而不是 JSESSIONID),这就是它不起作用的原因。
    【解决方案2】:

    由于我们无法将评论标记为答案(有些人可能会完全错过它),我将根据上面的 JB 指出具体的解决方案。使用this.getThreadLocalRequest().getSession().getId() 获取会话ID。使用 Cookies.setCookie(...) 将 sid 以 JSESSIONID 的形式存储在 cookie 中

    这将覆盖 GAE 创建的 cookie,保持相同的会话 ID,但应用您的到期时间。不过要小心你如何使用它,它很容易受到攻击(查找会话劫持和 XSS)。

    【讨论】:

    • 当我使用 servlet 过滤器时,这对我不起作用。当我检查响应时,尚未添加 JSESSIONID cookie,这意味着它是在之后添加的吗?我用 maxage-1 创建了我的,但它返回到浏览器,标题中有两个 JSESSIONID,只有一个会话到期
    • ..暗示 GAE 在我之后添加了 cookie,宣布过期
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2012-04-11
    相关资源
    最近更新 更多