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

时间:2015-03-26 22:18:43

标签: 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文件。)

这是某种安全功能吗?如果是的话,它应该防范什么呢? 或者它可能是一个简单的错误?

更新:使用&#37;实体而不是%符号也不起作用。
更新2:我尝试了但未能找到有关launchjnlp属性的确切语义的任何文档,但整个标记都是由deployJava.launchWebStartApplication(jnlp)生成的,这可能是“官方” “从浏览器启动Web Start应用程序的方式 更新3:只是对此非常清楚:上面的例子只是:一个例子。您可以使用绝对任何网址(相对,绝对,文件://,http://,您为其命名),任何网址编码字符来观察所描述的行为,甚至是一个无效的转义序列(虽然在这种情况下它或多或少是合理的),实际JNLP文件的存在与否是无关紧要的,因为我们甚至没有达到插件的地步会尝试加载JNLP文件。

1 个答案:

答案 0 :(得分:6)

  

这是某种安全功能吗?如果是的话,它应该是什么   要警惕?或者它可能是一个简单的错误?

从我能发现的内容来看,“直截了当的错误”就是答案。这是问题页面:

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中,以便在需要时自动发生。