由于 7u51
中的tighter security restrictions,1月到期,我正在尝试签署我的JNLP文件 .
我们的应用程序需要设置某些自定义系统属性,其中一些属性的值会根据applet的部署位置而有所不同 . 我想避免为每个部署重新签名包含JNLP模板的JAR .
将 <property name="my-prop" value="*"/>
放在JNLP模板中的天真方法不起作用 .
即使模板中有 <property name="my-prop" value="fixed-value"/>
,我有时会得到一个对话框"This application is going to perform an insecure operation. Do you want to continue?":
将系统属性传递给签名的Java RIA的正确方法是什么?
1 回答
在这两个方面,您的应用程序将需要添加一些在启动时执行的简单代码,以解决这两个问题 .
属性值中不允许使用通配符
JNLP specification说:
实际上,Oracle实现(至少在7u45中)确实将
<property/>
元素的value
属性列入黑名单 - 它不能是通配符 . 我一直无法找到这个决定背后的任何推理,但事实确实如此 .webstart解决方法允许任意属性名称和值; applet解决方法要求在代码签名时知道属性的名称 .
解决方法:Webstart
在JNLP文件中,包含许多通配符参数:
在应用程序的
main
方法中,解析这些参数并使用System.setProperty()将它们复制到系统属性中,跳过仍具有文字值"*"
的参数 . 我建议只在第一次出现"="
时拆分每个参数 . (如果您的应用程序已经采用了常规参数,则必须更具创造性 . )解决方法:Applet
在JNLP文件中,包含定义需要设置的系统属性的参数:
在Applet.init()方法中,获取
SYS_PROPERTY_PARAMETERS
参数的值,并迭代它以获取每个参数的值 . 如果它不是文字"*"
,请使用System.setProperty()
将其复制到系统属性 .“不安全操作”对话框
这是使用LiveConnect(Java < - > JavaScript交互)触发的bug in the Oracle plugin .
解决方法:“安全”属性前缀
使用
"jnlp."
在JNLP中通过<property/>
元素设置所有系统属性的前缀:然后在您的应用程序的
main()
或Applet.init()
方法中,迭代System.getProperties()的副本,如果属性名称以"jnlp."
开头,则将其值复制到具有该前缀被剥离的同名属性中 . (迭代副本是必要的,以避免ConcurrentModificationException
. )Gotcha:JNLP模板验证器考虑XML属性的顺序
最后,如果填充属性值的过程可能导致JNLP文档中其他元素的属性重新排序,则可能导致JNLP模板验证失败 . (使用DOM解析器解析JNLP,填充通配符,然后使用
StreamResult
将其流回来是这种情况的一种方式 . )例如,我有这两个多属性元素,并且元素的顺序必须匹配: