如何从浏览器启动已安装的JNLP应用?能否开发对应插件?
首先得明确:现代主流浏览器(Chrome、Edge、Firefox等)早就移除了对Java插件的原生支持,所以直接用JS/jQuery触发JNLP肯定走不通,这你已经知道了。下面针对你的问题逐一解答:
有没有现成的浏览器插件可用?
说实话,专门针对启动JNLP的现成插件非常少——因为JNLP本身是Java Web Start的产物,现在Java Web Start已经被Oracle标记为废弃,生态本身在萎缩。不过有一些通用的本地协议处理/原生消息通信类的扩展可以变通使用,但这类扩展通常需要你自己配置关联本地的JNLP启动逻辑,不是开箱即用的。而且很多这类扩展的安全性存疑,不建议在生产环境随便用。
能不能自行开发这类插件/扩展?
完全可以!主流浏览器的扩展API都提供了和本地程序交互的能力,足以实现从浏览器触发本地JNLP应用的需求。而且自定义开发的好处是可以完全适配你的自有应用场景,安全性也可控。
如何推进自定义扩展开发?
推荐两种主流实现方案,按安全性和稳定性排序:
方案一:Native Messaging(推荐)
这是现代浏览器官方推荐的扩展与本地程序交互的方式,安全且功能强大。核心思路是:扩展通过浏览器提供的Native Messaging API,和你编写的一个本地中间程序通信,由这个本地程序负责调用Java的javaws命令启动JNLP应用。
具体步骤:
- 编写本地中间程序
- 用你熟悉的语言(Python、Node.js、C#都可以)写一个简单的程序,功能是接收来自扩展的消息(比如JNLP文件的本地路径,或者JNLP的内容),然后执行
javaws <你的JNLP文件路径>命令。 - 注意:程序要遵循Native Messaging的通信规范——消息必须是JSON格式,且以4字节的长度前缀开头(具体格式可查对应浏览器的官方文档)。
- 用你熟悉的语言(Python、Node.js、C#都可以)写一个简单的程序,功能是接收来自扩展的消息(比如JNLP文件的本地路径,或者JNLP的内容),然后执行
- 创建浏览器扩展
- 编写
manifest.json,需要声明"nativeMessaging"权限,以及指定本地程序的配置文件信息。比如Chrome的manifest里要加:"permissions": ["nativeMessaging"], "background": { "service_worker": "background.js" } - 在你的自有应用页面中,通过content script或者popup触发消息发送,比如点击按钮时调用
chrome.runtime.sendMessage把JNLP的路径传给background script,再由background script调用chrome.runtime.sendNativeMessage和本地程序通信。
- 编写
- 配置本地程序的manifest文件
- 写一个JSON格式的配置文件(比如
com.yourcompany.jnlp-launcher.json),指定本地程序的路径、允许通信的扩展ID,然后把这个文件放到浏览器指定的目录:- Windows:
C:\Users\<你的用户名>\AppData\Local\Google\Chrome\User Data\Default\NativeMessagingHosts - Mac:
~/Library/Application Support/Google/Chrome/NativeMessagingHosts - Linux:
~/.config/google-chrome/NativeMessagingHosts
- Windows:
- 写一个JSON格式的配置文件(比如
方案二:自定义协议拦截
这种方式是注册一个自定义协议(比如my-jnlp://),扩展拦截这个协议的请求,然后触发本地程序打开JNLP。
具体步骤:
- 注册自定义协议
- 在系统层面注册自定义协议(Windows改注册表,Mac改plist文件,Linux改.desktop文件),关联到你的本地中间程序(负责启动JNLP)。
- 扩展拦截协议请求
- 在扩展中使用
chrome.registerProtocolHandlerAPI(Chrome/Edge)或者对应的Firefox API,注册对my-jnlp协议的处理。 - 当你的自有应用中出现
<a href="my-jnlp://path/to/app.jnlp">启动JNLP</a>这样的链接时,扩展拦截请求,提取JNLP路径,调用本地程序启动。
- 在扩展中使用
⚠️ 注意:自定义协议的方式安全性较低,容易被恶意网站滥用,而且浏览器对registerProtocolHandler有很多限制(比如需要用户手动授权,只能处理非标准协议),所以只适合测试或者内部环境使用。
关键安全注意事项
- 一定要验证消息来源:扩展要确保只处理来自你的自有应用的请求,本地程序要只接受信任的扩展发送的消息。
- 本地程序要做权限校验:避免被未授权的程序调用。
- 不要直接传递未验证的JNLP内容:防止注入恶意代码。
内容的提问来源于stack exchange,提问作者laxman kumar

