【问题标题】:Handling HTTP session timeout and redirect in Eclipse RAP application在 Eclipse RAP 应用程序中处理 HTTP 会话超时和重定向
【发布时间】:2016-02-18 00:48:52
【问题描述】:

我正在开发一个 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 来检测这种情况,现在应该重定向到某个地方以显示“会话超时,请重新加载”消息。

对于“会话超时”警告,我首选的解决方案是一个简单的 HTML5 页面,其中包含一个返回应用程序的链接。但我不知道如何将 HTML5 页面与 RAP 应用程序集成(以及这是否是一个好主意)。我也不清楚重定向应该如何以及在哪里发生。

为了重定向,我尝试了过滤器中的两种变体。 第一个给我“错误:SyntaxError:JSON.parse:JSON 数据的第 1 行第 1 列的意外字符”:

httpServletResponse.sendRedirect("/myapp");

还有这个“java.lang.IllegalStateException: Invalid thread access” 在 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 确实是一个错误,更新到 org.eclipse.rap.rwt_3.0.0.20150601-1556.jar 解决了这个问题。 RAP 基础架构可以很好地处理 HTTP 会话超时,无需自己动手。

标签: eclipse-rcp http-redirect httpsession eclipse-rap


【解决方案1】:

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

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

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

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

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

【讨论】:

【解决方案2】:

System.exit(0) 如果您希望终止流畅 - 然后修改您的应用程序特定关闭挂钩/退出代码响应以通知您。

基于 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();
}

【讨论】:

    猜你喜欢
    • 2011-03-24
    • 2012-10-25
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    相关资源
    最近更新 更多