一个运行在浏览器中的JavaScript和一个Java应用程序可以互相通信吗?

3

我有一个嵌入在网站中的JavaScript,运行在普通浏览器中,同时我有一个在同一台机器上运行的Java应用程序。我正在寻找一种方法让它们彼此通信。

我认为从浏览器内部运行的JavaScript创建本地文件系统中的文件是不可能的。

我想到的唯一方法是使用一个服务器,两个程序都可以向其发送消息,并从中轮询新消息。

还有其他方法可以实现这一点吗?


“在同一台机器上”在这里是什么意思?在浏览器中运行的Javascript将在客户端上调用。您也在客户端上运行Java应用程序吗? - Gimby
是的,Java应用程序和JavaScript都在客户端运行。 - Majiy
1
最自然的方式是让Javascript与一个了解HTML的服务器进行通信,例如在Tomcat中运行的典型servlet。应用程序可以以任何你喜欢的方式与servlet通信,但HTML或TCP/sockets听起来都很合理。然后,servlet将作为双向传递的中间人。 - geert3
那不就是Nashorn的一个使用案例吗(http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html)? - mhmpl
1
Nashorn 的使用案例是为 Java 提供脚本编写能力。据我所知,它与浏览器集成无关。 - Pavel Horal
Java应用程序是指在服务器上还是客户端上运行? - Compass
3个回答

3
我在实践中看到了几种方法:
  • 你的Java应用程序可以监听一些本地端口,JS可以通过XHR访问该端口。你需要注意跨站脚本攻击(你的JS可能需要从该本地URL加载),但这是可行的。最简单的方法可能是运行一个嵌入式HTTP服务器。
  • 你的Java应用程序可以在操作系统中注册为协议处理程序。然后JS会打开已注册应用程序的链接,从而将数据发送到它。
正如@PavelHoral所指出的,CORS是绕过同源策略的一种方法。

浏览器不够具体 - 我怀疑您是否可以从外部 Web 服务器拉取的 Web 应用程序连接到在本地主机上运行的内容,无论该本地服务器是否启用了 CORS。对我来说,这似乎是违反浏览器沙箱的行为,因为您仍将从外部托管的 Web 应用程序访问本地客户端。我很想看到一些官方规范,说明浏览器应该允许这样做。 - Gimby
@Gimby 请参见这篇文章和这篇文章,证明SOP适用于“localhost”。 - lexicore
@Gimby,你说得对,CORS确实与浏览器有关。例如,Chrome不支持localhost CORS。但是,你仍然可以通过使用lvh.me来解决这个问题。 - lexicore
@Gimby,有很好的迹象让我认为这应该可以工作,我甚至认为我已经看到过这个在实际操作中的情况。但是我不想再投入更多时间来证明我的立场,抱歉。 - lexicore
CORS在所有主要浏览器中都得到支持。Chrome的相关问题是关于通配符匹配的(同时一些评论似乎有点混淆)。 - Pavel Horal
显示剩余7条评论

1

在浏览器中,JavaScript 只能进行 AJAX 请求或与提供某些额外 JS 接口的浏览器插件进行通信。

本地 HTTP 连接

一种选择是在您的 Java 应用程序(不必是 servlet)中监听 HTTP 连接。

您需要正确处理 CORS

中央服务器

另一种选择是拥有一个中央服务器,您的 JS 和 Java 代码都将连接到该服务器。

Java Applet

另一种选择是拥有 Java Applet。当以特权模式运行时,您可以执行几乎任何操作(也许您可以将 Java 应用程序转换为 Java Applet)。

您需要在此处处理 Applet 安全性(例如使用受信任的证书对 Applet 进行签名)。


顺便说一下,对于中央服务器,我看到了基于JNLP的解决方案,其中Web客户端和富客户端通过JNLP加载并进行通信。这是一个不错的点。 - lexicore

0
请参考此问题,了解如何在JavaScript中进行直接套接字通信。您需要一个HTML5浏览器,而且如果您想在WWW上发布此内容,这可能不会“只是”起作用或者不一定是个好主意。 如何在JavaScript/HTML中使用套接字?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接