我想获得有关签名小程序 + XSL 转换的帮助
我有一个签名的小程序(带有 1 个 JAR 文件),它执行 XSL 转换,其中输入 XML、XSL 和输出在本地文件系统上读取/写入。我已经用 JRE 试过了
- 1.5.0_22
- 1.6.0_29
- 1.7.0_01
结果是一样的:
当我的 XSL 文件包含对外部 XML 文档的引用时:
<xsl:variable name="extXML" select="document('/tmp/A.XML')"/>
<xsl:value-of select="$extXML/Child"/>
转换失败:
com.sun.org.apache.xalan.internal.xsltc.TransletException: java.security.AccessControlException: access denied (java.io.FilePermission /tmp/A.XML read)
at com.sun.org.apache.xalan.internal.xsltc.dom.LoadDocument.documentF(LoadDocument.java:142)
at in.topLevel()
at in.transform()
at com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:603)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:709)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313)
at myxsltapplet.MyXSLTApplet.xsltTransform(MyXSLTApplet.java:66)
如果这个对外部 XML 文档的引用被注释掉,一切都会正常工作。使用策略文件可以解决这个问题,但不幸的是,这不是一个选项。
我已经实现了一个为TransformerFactory设置的URIResolver ,但我也得到了 AccessControlException。
在小程序中,我检索了SecurityManager及其AccessControlContext并注销了它们的哈希码:
SecurityManager: sun.plugin2.applet.Applet2SecurityManager@103fcaa
getSecurityContext(): java.security.AccessControlContext@17b2b2
我在 URIResolver 实现中做了同样的事情,并且 AccessControlContext 发生了变化:
SecurityManager: sun.plugin2.applet.Applet2SecurityManager@103fcaa
getSecurityContext(): java.security.AccessControlContext@ede64c
在原始 AccessControlContext 上调用 checkPermission 无异常运行。
在我的 URIResolver 中可访问的新 AccessControlContext 上调用 checkPermission:
AccessControlContext acc = (AccessControlContext) System.getSecurityManager().getSecurityContext();
acc.checkPermission(new FilePermission("/tmp/A.XML", "read"));
抛出:
ERROR: 'java.security.AccessControlException: access denied (java.io.FilePermission /tmp/A.XML read)'
这是正常现象还是错误?感谢您的任何想法,