在 Eclipse RAP 应用程序中处理 HTTP 会话超时和重定向

Handling HTTP session timeout and redirect in Eclipse RAP application

我正在开发 Eclipse RAP 应用程序(RCP 作为 Web 应用程序)。在 servlet 容器使 HttpSession 无效后(会话超时,超出 setMaxInactiveInterval),在浏览器中单击应用程序时抛出以下异常:

java.lang.NullPointerException
at org.eclipse.rap.rwt.internal.service.LifeCycleServiceHandler.service(LifeCycleServiceHandler.java:66)
at org.eclipse.rap.rwt.engine.RWTServlet.handleValidRequest(RWTServlet.java:135)
...

所以我实现了一个 javax.servlet.Filter 来检测情况,现在应该重定向到某个地方以显示 "session timeout, please reload" 消息。

对于 "session timeout" 警告,我的首选解决方案是一个带有 link 返回应用程序的简单 HTML5 页面。但我不知道如何将 HTML5 页面与 RAP 应用程序集成(以及这是否是一个好主意)。我也不清楚重定向应该如何发生以及发生在何处。

为了重定向,我在过滤器中尝试了两种变体。 第一个给了我 "Error: SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data":

httpServletResponse.sendRedirect("/myapp");

还有这个“java.lang.IllegalStateException:线程访问无效 在 org.eclipse.rap.rwt.RWT.checkContext(RWT.java:704)"

UrlLauncher launcher = RWT.getClient().getService(UrlLauncher.class);
launcher.openURL("http://www.eclipse.org/");

所以我可能真的走错了路...

是否有人知道在 Eclipse RAP 应用程序中处理 HTTP 会话超时情况的标准方法

HTTP 会话是处理此问题的正确位置吗 还是我应该查看 org.eclipse.rap.rwt.service.UISession 或其他内容?

如果应用程序位于“http://127.0.0.1:50045/myapp”之类的 URL 上,我如何重定向 到应用程序的主页?

我可以轻松地将简单的 HTML5 页面与 RAP 应用程序集成吗(同一 Eclipse 项目中的页面,部署在同一 WAR 中,可在同一主机上使用)?或者这将是一项无法开箱即用的繁琐任务?

首先,在正常操作期间不应发生 NullPointerException,请file a bug包括 RAP 版本和堆​​栈跟踪。

只是猜测,问题可能是由请求处理中的会话无效引起的。如果是这种情况,使用具有较小超时的 HttpSession 方法 setMaxInactiveInterval 可能会有所帮助。

重定向的问题是 RAP 应用程序向服务器发送后台 (a.k.a。Ajax) 请求并期望在 return 中得到 JSON 响应。如果您的过滤器重定向到某个其他页面,RAP 客户端将收到一个 HTML 页面而不是 JSON。为了将浏览器重定向到另一个页面,您应该向包含此重定向的客户端发送 JSON 响应(请参阅 bug 388249):

{"head": {"redirect": "http://www.myurl.com/"}}

要将其他 HTML5 个页面集成到您的 RAP 应用程序中,请考虑 Browser 小部件。

System.exit(0) 如果您希望终止是流畅的 - 然后修改您的 应用程序特定 关闭 hooks/exit 代码响应以根据需要进行通知。

Java 基于 RAP/RCP:

try{
            HttpSessionCollector.terminationQueue.remove(RWT.getUISession().getId());
            RWT.getUISession().getHttpSession().invalidate();
            System.exit(0);
}catch(Exception ex){
            ex.printStackTrace();
            System.out.println("failed to terminate session. adding user back to sessions list");
            HttpSessionCollector.add();
}