Mat*_*nry 3 java jnlp applet java-web-start signed-applet
由于严格的安全限制的7u51,在一月份到期,我想我签字JNLP文件.
我们的应用程序需要设置某些自定义系统属性,其中一些属性的值会根据applet的部署位置而有所不同.我想避免为每个部署重新签名包含JNLP模板的JAR.
放入<property name="my-prop" value="*"/>JNLP模板的天真方法不起作用.
即使<property name="my-prop" value="fixed-value"/>在模板中,我有时会得到一个对话框,说"此应用程序将执行不安全的操作.你想继续吗?":

将系统属性传递给签名的Java RIA的正确方法是什么?
在这两个方面,您的应用程序将需要添加一些在启动时执行的简单代码,以解决这两个问题.
该JNLP规范说:
预计JNLP客户端将黑名单(或限制)某些jnlp元素和参数值(例如"java-vm-args"或属性"name"和"value")以保持安全性.确切的列表取决于各个JNLP客户端实现.
实际上,Oracle实现(至少在7u45中)确实value将<property/>元素的属性列入黑名单- 它不能是通配符.我一直无法找到这个决定背后的任何推理,但事实确实如此.
webstart解决方法允许任意属性名称和值; applet解决方法要求在代码签名时知道属性的名称.
在JNLP文件中,包含许多通配符参数:
<application-desc main-class="com.example.YourMainClass">
<argument>*</argument>
<argument>*</argument>
</application-desc>
Run Code Online (Sandbox Code Playgroud)
在应用程序的main方法中,解析这些参数并使用System.setProperty()跳过仍具有文字值的参数将其复制到系统属性中"*".我建议简单地在第一次出现时拆分每个参数"=".(如果您的应用程序已经采用了常规参数,则必须更具创造性.)
在JNLP文件中,包含定义需要设置的系统属性的参数:
<applet-desc main-class="com.example.YourMainClassApplet">
<param name="SYS_PROPERTY_PARAMETERS" value="prop1,prop2"/>
<param name="prop1" value="*"/>
<param name="prop2" value="*"/>
</applet-desc>
Run Code Online (Sandbox Code Playgroud)
在您的Applet.init()方法中,获取SYS_PROPERTY_PARAMETERS参数的值,并迭代它以获取每个参数的值.如果它不是文字"*",请使用将其复制到系统属性System.setProperty().
这是Oracle插件中的一个错误,它由使用LiveConnect(Java < - > JavaScript交互)触发.
通过<property/>JNLP中的元素预先设置所有系统属性"jnlp.":
<property name="jnlp.my-prop" value="fixed-value"/>
Run Code Online (Sandbox Code Playgroud)
然后在您的应用程序main()或Applet.init()方法中,迭代一个副本 System.getProperties(),如果属性名称以,则将"jnlp."其值复制到具有该前缀的同名属性中.(迭代副本是必要的,以避免ConcurrentModificationException.)
最后,如果填充属性值的过程可能导致JNLP文档中其他元素的属性重新排序,则可能导致JNLP模板验证失败.(使用DOM解析器解析JNLP,填充通配符,然后使用StreamResult这种方式将其重新流式传输.)例如,我有这两个多属性元素,并且元素的顺序必须匹配:
<jnlp codebase="*" spec="1.0+">
<j2se java-vm-args="-Xms256M -Xmx512M -XX:MaxPermSize=256m" version="1.6+"/>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2239 次 |
| 最近记录: |