java - 如果 JNLP url 包含 %,为什么 Java WebStart 应用程序拒绝启动?

标签 java java-web-start jnlp

在尝试根据传递给 HTTP 服务器的 URL 参数动态生成 JNLP 文件时,我注意到一件奇怪的事情。如果我的 HTML 代码中有类似这样的内容,它就可以工作:

<embed type="application/x-java-applet;" launchjnlp="dummy.jnlp"/>

另一方面,如果我在 launchjnlp 属性中有一个 % 字符,插件将不会执行任何操作:

<embed type="application/x-java-applet;" launchjnlp="dummy%3f.jnlp"/>

没有错误消息,没有默认的 Java 启动画面,什么都没有,它默默地失败了。 (甚至没有尝试检索 JNLP 文件。)

这是某种安全功能吗?如果是,应该注意什么?
或者这可能是一个简单的错误?

更新:使用 % 实体代替 % 符号也不起作用。
更新 2: 我尝试并未能找到关于 launchjnlp 属性的确切语义的任何文档,但整个标记是由 deployJava.launchWebStartApplication(jnlp) 生成的,这被认为是从浏览器启动 Web Start 应用程序的“官方”方式。
更新 3: 只是为了绝对清楚这一点:上面的例子只是:一个例子。您可以使用绝对任何 URL(相对、绝对、file://、http://,随便你怎么命名)、任何 url 编码字符来观察所描述的行为,甚至无效的转义序列(尽管在这种情况下它或多或少是合理的),实际 JNLP 文件的存在与否无关紧要,因为我们甚至没有达到插件所在的地步将尝试加载 JNLP 文件。

最佳答案

Is this some kind of security feature? If it is, what is it supposed to guard against? Or could it be a straightforward bug?

据我所知,“直接错误”就是答案。这是问题页面:

https://bugs.openjdk.java.net/browse/JDK-8043409

看来要到 JDK 9 发布才能修复。

我建议尝试不同的 JDK 实现,但考虑到 amount of code shared between the Oracle and OpenJDK implementations,这似乎不太可能改变任何东西。以及 WebStart code appears to be proprietary/closed-source 的事实.

因此,您使用 base64 编码设计的解决方法可能是目前的最佳选择。如果您必须经常这样做,也许可以将编码步骤整合到 deployJava.launchWebStartApplication(jnlp) JavaSript API 中,以便在需要时自动执行。

关于java - 如果 JNLP url 包含 %,为什么 Java WebStart 应用程序拒绝启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29289932/

相关文章:

java - 在 MAC 上无需第三方插件即可从终端运行 JNLP 文件

java - 使用 $$context 签署 JNLP 在 java 7.45 中不起作用

java - 只要用户输入不等于某些单词就运行的 while 循环不起作用?

java - 使用循环从 url 加载图像

java - 'java' 、 'javaw' 和 'javaws' 之间有什么区别?

java - Java 7 中新的 JNLP Missing items 警告有什么用?

自 JDK 1.7 以来,Java Web Start 已损坏

java - 如何在 jnlp 文件中区分 32 位和 64 位 java 版本

java - 针对不同的屏幕密度使用不同的字体

java - Ormlite - 扩展 BaseDaoImpl 时构造函数调用失败