【问题标题】:java/GWT web app : how to get a callback on Session Timeoutjava/GWT web 应用程序:如何获取会话超时回调
【发布时间】:2011-04-27 14:37:50
【问题描述】:

我们有一个部署在 Tomcat 上的 GWT 应用程序。在服务器上,我们设置了 1 分钟的超时时间

httpSession.setMaxInactiveInterval(1*60) 

在客户端,我们也设置了一些超时值为 1 分钟的 cookie。 1 分钟后,我们注意到客户端 cookie 被删除;但是 servlet 容器(jetty/tomcat)设置的 JSESSIONID 仍然存在于客户端中。

在会话超时时,我们的用户希望我们抛出一个警报/消息对话框来提醒他/她会话已超时并且用户应该再次登录到服务器。看来我们需要一个客户端的超时回调——有没有我们可以调用的 API 来设置会话超时的回调?

到目前为止,如果用户使用过期会话访问服务器,我们会告诉他会话已过期;但是,客户希望我们通过提醒用户会话已超时来防止“丢失更改”(而不是浪费时间编辑任何客户端数据,然后提交以发现会话已超时 - 丢失更改!)

还有什么其他的处理方式?

谢谢,

【问题讨论】:

  • 我刚开始使用 GWT,这个问题让我有点困惑。您正在使用会话来存储用户信息?您的目标不是使其无状态并在每个请求中传递用户信息吗? GWT 的优势之一不是您不受限制于超时没有意义的“会话”想法吗?

标签: java session tomcat gwt session-timeout


【解决方案1】:

要从服务器发送数据,您可以使用HTML5 Web Sockets 或对于旧版浏览器,使用某种形式的Comet

或者,您可以让 GWT 客户端定期向服务器发送 ping 以检查会话是否仍然可用,但这会导致大量不必要的 HTTP 请求并且效率会降低。

【讨论】:

  • 谢谢。没有其他替代方法可以在会话超时时获得回调吗?
  • Web Socket 支持仍然很受欢迎。您可以使用一些不同的解决方法来模拟它,但我认为在这种情况下不值得麻烦。在这种情况下,只要让服务器在终止会话之前最终响应未完成的请求,长轮询就可以很好地工作。
  • Java servlet 容器中的 Web 套接字支持不存在。我们使用 chrome,因此它可以在最新版本的浏览器中使用;
【解决方案2】:

如果您的应用程序有一个 web.xml 文件,请将其添加到 webapp 部分

<session-config>
     <session-timeout>30</session-timeout>
</session-config>

这是会话的服务器端超时(以分钟为单位)

*编辑 - 因为一些读者似乎忘记了这个想法。 如果用户尝试使用过期会话访问服务器,则可以按照原始发布者的要求将他们重定向到登录页面。当 cookie 过期时,前端没有理由向服务器发送回调。如果用户没有发送 sessionID,他们会转到登录屏幕。如果他们将会话 ID 发送到已过期的服务器,请将其发送到登录页面。弹出消息可以在前端处理

【讨论】:

  • 问题不在于设置超时时间。
  • Other then "但是客户端中仍然存在 servlet 容器(jetty/tomcat) 设置的 JSESSIONID。"、"会话已超时,用户应重新登录服务器"和“还有什么其他方法可以处理这种情况?”。如果用户尝试使用过期会话访问服务器,则可以按照原始发布者的要求将他们重定向到登录页面。
  • 嗨,肖恩,谢谢。到目前为止,如果用户使用过期会话访问服务器,我们会告诉他会话已过期;但是,客户希望我们提醒用户会话已超时,而不是浪费时间编辑任何客户端数据,然后提交以发现会话已超时。
  • 你可以用javascript写一个方法。它检查 cookie 是否存在。 if(getCookie('jsessionid') == null) 行中的某些内容,如果找到,则向用户显示弹出消息。这将在客户端检测您的场景,并在用户继续编辑更多信息之前提醒他们
  • 嗨,肖恩,谢谢。但是,正如我在问题中指出的那样,除了 JSESSIONID(由服务器端设置)之外的所有其他客户端 cookie 在会话超时时过期;然而,JSessionID 不会在会话超时时过期——当在 Chrome 开发者工具中自省时,我们可以看到 JSESSIONID 有一个会话值为 Expiry。但是,在 cookie 过期时向用户显示消息的想法是个好主意 -- 会探索并回复您。
【解决方案3】:

我们已经在 GWT 应用程序中完成了它,在会话到期之前用户会收到警告

  • 我们让每个客户端请求都经过 LoggingAsyncHandler(我们用这个扩展了每个异步调用)
  • 在 LoggingAysyncHandler 中,我们设置了计时器(来自 GWT 的 Timer 类),它比会话超时时间少一点,因此如果在此之前没有任何活动,我们会向客户端弹出一条消息:“您愿意继续吗”如果他们按下确定,我们重置了计时器并对服务器进行了虚拟调用,该服务器也重置了会话超时。

希望对你有帮助!

【讨论】:

  • vishal,谢谢——这个想法确实有帮助。将尝试实施相同的操作并回复您。
  • “我们让每个客户端请求都通过 LoggingAsyncHandler (我们用这个扩展每个异步调用)”——你能详细说明一下吗? Async 不是接口吗?你能分享一些高级代码吗?谢谢。
  • @anjanb:代码有点乱,但想法是让每个异步处理程序都从进一步实现 AsyncCallback 的 LoggingAsyncHandler 扩展。现在您可以使用通用代码在 LoggingAsyncHandler 中重新启动计时器。
猜你喜欢
  • 1970-01-01
  • 2011-02-26
  • 2019-06-23
  • 1970-01-01
  • 2016-10-25
  • 2011-09-23
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
相关资源
最近更新 更多