在尝试根据传递给 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/