Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java/GWT web应用程序:如何在会话超时时获取回调_Java_Session_Tomcat_Gwt_Session Timeout - Fatal编程技术网

java/GWT web应用程序:如何在会话超时时获取回调

java/GWT web应用程序:如何在会话超时时获取回调,java,session,tomcat,gwt,session-timeout,Java,Session,Tomcat,Gwt,Session Timeout,我们有一个部署在Tomcat上的GWT应用程序。在服务器上,我们已将超时设置为1分钟 httpSession.setMaxInactiveInterval(1*60) 在客户端,我们还设置了一些超时值为1分钟的cookie。1分钟后,我们注意到客户端cookie被删除;但是,servlet容器(jetty/tomcat)设置的JSESSIONID仍然存在于客户机中 在会话超时时,用户希望我们抛出一个警报/消息对话框,提醒他/她会话已超时,用户应再次登录服务器。似乎我们需要在超时时进行客户端回

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

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

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

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

处理这种情况的其他方法是什么


谢谢,

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


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

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

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

30
这是会话的服务器端超时(分钟)

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

我们已经在GWT应用程序中完成了这项工作,在会话到期之前会向用户发出警告


  • 每个客户端请求都要经过LoggingAsyncHandler(我们用这个扩展每个异步调用)
  • 在LoggingaySynchHandler中,我们设置了一个计时器(GWT中的一个计时器类),该计时器略小于会话超时,因此,如果在此之前没有任何活动,我们会向客户端弹出一条消息:“您想继续吗?”如果他们按ok,我们会重置计时器,并对服务器进行虚拟调用,从而重置会话超时

希望有帮助

问题不在于设置超时时间。除了“但是servlet容器(jetty/tomcat)设置的JSESSIONID仍然存在于客户端中”、“会话已超时,用户应再次登录服务器”和“有什么其他方法来处理这种情况?”。如果用户试图使用过期会话访问服务器,他们可以按照原始海报的要求重定向到登录页面。嗨,肖恩,谢谢。到目前为止,如果用户使用过期会话访问服务器,我们会告诉他会话已过期;但是,客户希望我们提醒用户会话已超时,而不要浪费时间编辑任何客户端数据,然后提交以发现会话已超时。您可以用javascript编写一个方法。检查cookie是否存在。if(getCookie('jsessionid')==null)行中的某些内容,如果找到该内容,则向用户显示一条弹出消息。这将在客户端检测您的场景,并在用户继续编辑更多信息之前提醒用户Hi Sean,谢谢。但是,正如我在问题中指出的,除了JSESSIONID(由服务器端设置)之外的所有其他客户端cookie在会话超时时过期;然而,JSSessionID不会在会话超时时过期——当在Chrome开发者工具中反省时,我们可以看到JSSessionID有一个会话值要过期。然而,当cookie过期时向用户显示消息是一个好主意——我们将探索并返回给您。谢谢。没有其他方法可以在会话超时时获得回调吗?Web套接字支持仍然是一帆风顺的。你可以用一些不同的解决方法来模仿它,但我认为在这种情况下不值得这么麻烦。在这种情况下,长轮询可以很好地工作,只要让服务器在终止会话之前最终响应未完成的请求即可。Javaservlet容器中不存在Web套接字支持。我们使用chrome,因此它可以在最新版本的浏览器中使用;维沙,谢谢,这个主意确实有用。我们将尝试实现相同的功能,并返回给您。“我们的每个客户端请求都要经过LoggingAsyncHandler(我们用它扩展每个异步调用)”--您能详细说明一下吗。异步不是一个接口吗?你能分享一些高级代码吗?谢谢。@anjanb:代码有点混乱,但我们的想法是让每个异步处理程序都从LoggingAsyncHandler扩展,后者进一步实现了AsyncCallback。现在,您可以在LoggingAsyncHandler中使用常用代码重新启动计时器。我只是从GWT开始,这个问题让我有点困惑。您正在使用会话存储用户信息?难道你不打算让它成为无状态的,并在每个请求上传递用户信息吗?GWT的优势之一不就是您不受“会话”概念的限制,而超时是没有意义的吗?