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

如果JNLP url包含%,为什么Java WebStart应用程序拒绝启动?,java,java-web-start,jnlp,Java,Java Web Start,Jnlp,在尝试根据传递给HTTP服务器的URL参数动态生成JNLP文件时,我注意到了一件奇怪的事情。如果我的HTML代码中有类似的内容,它可以工作: <embed type="application/x-java-applet;" launchjnlp="dummy.jnlp"/> 没有错误消息,没有默认的Java启动屏幕,什么都没有,它会自动失败。(甚至不尝试检索JNLP文件。) 这是某种安全功能吗?如果是,应该防止什么? 或者它可能是一个简单的bug 更新:使用和#37实体而不是%符号

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

<embed type="application/x-java-applet;" launchjnlp="dummy.jnlp"/>
没有错误消息,没有默认的Java启动屏幕,什么都没有,它会自动失败。(甚至不尝试检索JNLP文件。)

这是某种安全功能吗?如果是,应该防止什么?
或者它可能是一个简单的bug

更新:使用
和#37实体而不是
%
符号也不起作用。
更新2:我试图找到任何关于
launchjnlp
属性确切语义的文档,但未能找到,但整个标记是由生成的,这被认为是从浏览器启动Web Start应用程序的“官方”方式。
更新3:这一点非常清楚:上面的例子就是:一个例子。您可以使用绝对任何URL(相对、绝对、文件://,http://,您可以随意选择),任何URL编码字符,甚至无效转义序列(尽管在这种情况下或多或少是合理的),实际JNLP文件的存在或不存在是无关的,因为我们甚至没有到达插件尝试加载JNLP文件的点

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

据我所知,“直截了当的错误”是答案。以下是问题页面:

在JDK9发布之前,它似乎不会被修复

我建议尝试一种不同的JDK实现,但考虑到


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

您是否尝试使用HTML实体
%?@Obicere我刚试过,也没用。这并不奇怪,因为我希望实体在到达Java插件之前得到解析。@davida。我知道这一点,这正是我想要做的:urlencode一个参数。但正如您所看到的,只要我在url中放入一个编码字符(
%3f->?
,在本例中),事情就会破裂。请注意,无论我是否提供有效的转义序列,行为都是相同的,因此
dummy%.jnlp
也将失败。@StefanHaustein该属性(理论上)可以包含任何有效的URL,因此问号是完全合理的。我只是构建这些示例进行演示,但在实际场景中,URL看起来像
http://.../something.jnlp?param=
。是的,解决方法是使用我自己的非标准转义方法(好吧,base64),但问题是为什么我必须这么做。@Ben,拜托,这只是一个例子。您可以在任何文件名的任何位置将其替换为您喜欢的任何字符。如果你愿意,它可以是一个真实的文件,如果你愿意,它可以是一个不存在的文件,它可以是一个http url,一个https url,任何你喜欢的,但是只要你把一个
%
字符放在任何地方,它就会停止工作。谢谢你,我不知道插件的实现是封闭源代码的。哦,好吧。
<embed type="application/x-java-applet;" launchjnlp="dummy%3f.jnlp"/>