gpt4 book ai didi

java - 如何在浏览器和 Java Web Start 小程序之间进行通信

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:14 30 4
gpt4 key购买 nike

现状

我们目前使用小程序来执行一些操作,之后它会重定向当前页面。在其核心中,您可以看到如下所示的小程序:

public class ExampleApplet extends Applet {
@Override
public void init() {
Button redirect = new Button("Redirect");
this.add(redirect);
final String target = this.getParameter("targetPage");
redirect.addActionListener((ActionEvent e) -> {
try {
getAppletContext().showDocument(new URL(target), "_parent");
} catch (MalformedURLException ex) {}
});
}
}

以最简单的方式调用小程序:

<applet code="com.example.applet.ExampleApplet.class" archive="${appletUrl}" width="100" height="30">
<param name="targetPage" value="http://localhost:8080/applet/"/>
</applet><br/><br/>

其中 ${appletUrl} 返回小程序 JAR 的位置。

所以小程序只不过是一个调用 getAppletContext().showDocument(new URL(target), "_parent"); 来刷新当前页面的简单按钮。这已经正确地完成了很长一段时间的工作。问题来了。

迁移

许多人可能知道,Chrome 不支持 Applet。由于 IEFireFox 仍然支持它们,因此搁置了一段时间。 2016年底,他们也将不再支持他们。因此,我们决定使用 JWSJNLP 迁移小程序。

迁移这个简单的重定向按钮示例将提供以下 html 片段和 JNLP 文件:

<a href="${jnlpUrl}">Launch JNLP</a>

${jnlpUrl} 返回 JNLP 文件的位置,即:

<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="http://localhost:8080/applet/assets/1.0-SNAPSHOT-DEV/app/assets/" href="jnlp/example.jnlp">
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.5+" initial-heap-size="32m" max-heap-size="128m" />
<property name="jnlp.versionEnabled" value="false"/>
<jar href="applets/ExampleApplet.jar" main="true"/>
</resources>
<applet-desc name="code" main-class="com.example.applet.ExampleApplet.class" width="30" height="30" >
<param name="targetPage" value="http://localhost:8080/applet/"/>
</applet-desc>
</jnlp>

到目前为止一切顺利,同一个小程序成功部署为 JWS 应用程序。允许从任何浏览器使用它,因为它是在它之外执行的。这也是一个问题。

问题

getAppletContext().showDocument(new URL(target), "_parent"); 仍然进行重定向,但它使用默认浏览器,如 migration documentation. 中所述

For AppletContext.showDocument(URL url, String target), the target argument will be ignored by Java Web Start technology.

Similar to AppletContext.showDocument, Java Web Start applications are capabile of showing an HTML page using the system's default web browser by using the BasicService.showDocument API.

因此,如果我的默认浏览器是 FireFox,但我恰好在 IE/Chrome 中浏览到这个支持 JWS 的小程序,那么将在 FireFox 中打开一个新选项卡。这是一个问题,因为我在原始浏览器中存储了信息(例如登录)!

调查结果

由于应用程序在浏览器之外运行,我在考虑与原始浏览器通信的可能性时遇到了问题。我无法使用 JavaScript,因为它不在浏览器中运行。我无法真正定义一种独立于系统的方式来在原始浏览器中打开选项卡。我还想到了 WebSockets,因为它们可以允许直接通信,但从我读到的内容来看,它非常高级并且需要一个服务器,而不是一个简单的小程序。

当小程序打开一个新窗口时,是否有可能在原始浏览器之间进行通信(例如 websockets 和参数)或将 session 从一个浏览器传递到另一个浏览器?

最佳答案

我找到了一个可行的解决方案。

由于 applet 失去了与浏览器及其 session 的所有连接,提供通信的另一种方法是使用 WebSocketsComet。在我的例子中,我将 CometAtmosphere 一起使用框架和一个Tapestry-Atmosphere实现,因为 Tapestry 是我正在使用的 View 框架。

在不深入了解 Tapestry 实现的情况下,我做了以下工作:

  • 在客户端浏览器上设置一个主题,它将以典型的发布/订阅方式收听广播消息。
  • Applet 中提供当前浏览用户唯一的 Topic ID,以及用于发送请求的 URL到。使用 Topic ID 作为 url 的请求参数。
  • 服务器端我有接收Topic作为请求参数的请求端点。使用此参数,它向主题发送广播(可能为空)。
  • 客户端 Topic 收到通知并自行执行事件。该事件是重新呈现页面的特定内容。

因为它使用 Comet(但也可以使用 WebSockets),它直接在浏览器中发生。每个浏览器实际上都订阅了那个主题,但这里只有一个。

使从小程序的简单请求更新页面成为可能。小程序只有行 getAppletContext().showDocument(new URL(target), "_parent"); 更改为 new URL(target).openConnection().getInputStream();target 是包含请求参数的 URL。

关于java - 如何在浏览器和 Java Web Start 小程序之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37862461/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com