【问题标题】:SecurityManager and XSLT extensions in Java7 Update4 broken?Java7 Update4 中的 SecurityManager 和 XSLT 扩展损坏了吗?
【发布时间】:2012-05-25 20:10:37
【问题描述】:

Java 应用程序 FreeMind 使用 XSLT 从旧文件进行更新。 XSLT 使用静态 java 函数来简化字符串操作。这在 Java 7 update 2 之前都可以正常工作,并在 windows 下的 java7 update 4 中给出以下异常:

STDERR: ERROR:  'The first argument to the non-static Java function 'replaceSpacesToNonbreakableSpaces' is not a valid object reference.'
STDERR: FATAL ERROR:  'Could not compile stylesheet'May 26, 2012 10:50:06 PM freemind.main.Resources logException
SEVERE: An exception occured: 
javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(Unknown Source)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(Unknown Source)
    at freemind.main.Tools$1TransformerRunnable.run(Tools.java:1023)
    at java.lang.Thread.run(Unknown Source)

把它归结为一个最小的例子,它出现了,自定义 SecurityManager 是罪魁祸首。如果设置,代码将失败。如果注释掉,代码就可以工作。有谁知道,java7 的安全系统在更新 2 和更新 4 之间发生了什么变化,或者还有什么可能导致这种情况?

这是一个更简单的例子:

package freemind.main;

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.transform.Result;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public final class FreeMindSecurityTest  {

    public static void main(String[] args) throws Exception {
        // if commented out, this program works as expected.
        System.setSecurityManager(new SecurityManager());
        String input = "<map version=\"0.9.0\">"
                + "</map>";
        String xslt = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
                + "     <xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns:FreeMindSecurityTest=\"xalan://freemind.main.FreeMindSecurityTest\" exclude-result-prefixes=\"FreeMindSecurityTest\">"
                + "         <xsl:template               match=\"/ | node() | @* | comment() | processing-instruction()\">"
                + "             <xsl:value-of select=\"FreeMindSecurityTest:replaceSpacesToNonbreakableSpaces('test')\"/>"
                + "         </xsl:template>" + "        </xsl:stylesheet>";
        StringWriter writer = new StringWriter();
        final Result result = new StreamResult(writer);

        final StreamSource sr = new StreamSource(new StringReader(input));
        // create an instance of TransformerFactory
        TransformerFactory transFact = TransformerFactory.newInstance();
        Transformer trans = transFact.newTransformer(new StreamSource(
                new StringReader(xslt)));

        trans.transform(sr, result);

        System.out.println("Transformed: " + writer.getBuffer());
        writer.close();
    }

    public static String replaceSpacesToNonbreakableSpaces(String input) {
        return input;
    }



}

简而言之,java 认为该方法不是静态的(但它是静态的)并且错过了对象引用。

TIA,来自 FreeMind 的克里斯

编辑:添加了最短示例(只需设置普通安全管理器的副本即可)。

【问题讨论】:

  • 没有人会阅读您的代码,尤其是当堆栈跟踪是德语时。您能否缩小代码范围并将它们放在这里?如果您不确定如何使用堆栈溢出,请先阅读此内容stackoverflow.com/faq
  • 获取英文消息的一种方法是将user.language系统属性设置为en
  • 谢谢,上面编辑了英文输出。
  • 是安全管理器内部的 XSLT 调用失败,还是安全管理器到位时其他一些 xslt 调用失败的问题?
  • @bmargulies:我不明白这个问题。但事实证明,即使设置正常的SecurityManager 也会导致此 XSLT 转换失败。

标签: java security xslt java-7 xslt-extension


【解决方案1】:

JAXP 1.4.6 (in Java 7 Update 4) 中可能存在错误。 Java 7u4 的一个变化是升级到了 JAXP 1.4.6,请参阅Java Release Notes

一种解决方法/解决方案(也许不是最佳选择)是通过Java endorsed folder 使用 Xalan 2.7.1 而无需额外的补丁。 (将 xalan 2.7.1 jar 复制到 jre/libs/endorsed) 或者使用 Xalan 作为第三方库。

它在带有 J7U4 和 Xalan 2.7.1 的 Linux64 上为我工作

Transformed: <?xml version="1.0" encoding="UTF-8"?>test

【讨论】:

  • Java endorsed 文件夹有一点错别字:实际上应该是jre/lib/endorsed
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 2018-05-25
相关资源
最近更新 更多