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

Why does Java WebStart application refuse to start if JNLP url contains %?

我在尝试根据传递给 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 文件。)

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

更新: 使用 &#37; 实体代替 % 符号也不起作用。
更新 2: 我尝试并没有找到关于 launchjnlp 属性的确切语义的任何文档,但整个标签是由 deployJava.launchWebStartApplication(jnlp) 生成的,据说"official" 从浏览器启动 Web Start 应用程序的方式。
更新 3: 绝对 crystal 清楚这一点:上面的例子只是:一个例子。您可以使用 absolutely any URL(相对,绝对,file://,http://,随便你怎么说)观察所描述的行为,any 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?

据我所知,'straightforward bug' 就是答案。这是问题页面:

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

似乎要等到 JDK 9 发布后才能修复。

我建议尝试不同的 JDK 实施,但鉴于 amount of code shared between the Oracle and OpenJDK implementations and the fact that the WebStart code appears to be proprietary/closed-source.

这似乎不太可能改变任何事情

因此,您使用 base64 编码设计的解决方法可能是目前的最佳选择。如果您必须经常这样做,也许编码步骤可以滚动到 deployJava.launchWebStartApplication(jnlp) JavaSript API 中,以便它自动发生 if/when 需要。