【问题标题】:Persistent http sessions (browser/instance restart ) in GAE - JavaGAE - Java 中的持久 http 会话(浏览器/实例重启)
【发布时间】:2012-12-28 21:27:54
【问题描述】:

我想知道在基于 GAE 的 Web 应用程序中是否有一种“标准”方式来处理持久 HTTP 会话。让我解释一下我的问题。

如果我只使用 this.getThreadLocalRequest().getSession() 来获取会话,一旦用户关闭浏览器,该会话就会自动失效。

如果我使用 Cookie(因此会话将持续到 cookie 过期或用户删除他的 cookie),我需要有一种机制来验证存储在 cookie 中的 sessionID 实际上属于有效会话。我曾考虑将 sessionID 的键值对 HttpSession 存储在 concurrentHashMap 中,但现在我遇到了这个 hashmap 仅适用于当前实例的问题,因此我可能会遇到一致性问题。

我想到的最后一个解决方案是在数据存储中跟踪会话,但每次收到请求时都必须查询数据存储对我来说似乎很荒谬。

也许我完全偏离了轨道,有一种非常简单的方法可以实现我想要做的事情:在浏览器重启和多个 gae 实例中持续存在的 Http 会话。

谢谢! 罗德里戈。

【问题讨论】:

    标签: java google-app-engine servlets


    【解决方案1】:

    您通常使用 cookie 来实现记住我。这个想法是为经过身份验证的用户生成一个随机且唯一的 cookie,将其与其余用户信息一起存储在数据库中,并将 cookie 发送到客户端浏览器。

    现在,当客户端在 5 天后返回时,cookie 会与它的第一个请求一起发送到您的应用程序。这时,如果用户还没有被认证,你可以从请求中提取cookie,在数据库中找到拥有这个cookie的用户,并自动认证他,就像他发送了他的凭据一样。

    此解决方案无需对 GAE 处理会话的方式进行任何修改。

    【讨论】:

    • 所以我应该结合使用会话和cookies,首先检查会话是否可用,如果没有我应该寻找cookie?现在会话仅在 servlet 范围内有效,对吗?如果另一个 jvm 实例打开了怎么办?这不会使会话不一致吗?在一个 servlet 中可用,而在另一个 servlet 中不可用
    • 会话通常在第一次被请求时创建,与用户是否经过身份验证没有任何关系。它用于存储多个后续请求的属性。例如,一旦执行了 JSP,您就有了一个会话。用户通过身份验证后,您可以通过在会话中存储一些标志或用户数据来记住它。一个用户的会话对于整个 webapp 都是一样的。 GAE 使会话持久化,因此另一个 JVM 将看到第一个 JVM 创建的会话。记住我的 cookie 只是验证用户的另一种方式。
    • 记录一下:如果会话在整个 JVM 中是持久的,那么最好的解决方案可能是跟踪会话并在第一时间放置一个 Cookie(并最终更新它),这样当用户关闭浏览器他不必再次进行身份验证。谢谢!
    • 呃,这正是我在回答中告诉你要做的。 cookie 用于自动验证发送 cookie 的用户,而无需提供凭据。并且一旦通过 cookie 自动进行身份验证,用户的身份就可以存储在会话中。
    猜你喜欢
    • 2015-02-24
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2018-10-25
    相关资源
    最近更新 更多