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

biz*_*lop 8 java jnlp java-web-start

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

<embed type="application/x-java-applet;" launchjnlp="dummy.jnlp"/>
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我%launchjnlp属性中有一个字符,插件根本不会做任何事情:

<embed type="application/x-java-applet;" launchjnlp="dummy%3f.jnlp"/>
Run Code Online (Sandbox Code Playgroud)

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

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

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

aro*_*oth 6

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

从我可以发现的,"直截了当的错误"就是答案.这是问题页面:

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

在JDK 9发布之前,它似乎没有安排修复.

我建议尝试不同的JDK实现,但考虑到Oracle和OpenJDK实现之间共享的代码量以及WebStart代码似乎是专有/封闭源这一事实,这似乎不太可能改变任何东西.

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