在尝试根据传递给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:只是对此非常清楚:上面的例子只是:一个例子。您可以使用绝对任何网址(相对,绝对,文件://,http://,您为其命名),任何网址编码字符来观察所描述的行为,甚至是一个无效的转义序列(虽然在这种情况下它或多或少是合理的),实际JNLP文件的存在与否是无关紧要的,因为我们甚至没有达到插件的地步会尝试加载JNLP文件。
答案 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中,以便在需要时自动发生。