【问题标题】:Producing xml-signature with windows line-break running in LINUX使用在 LINUX 中运行的 windows 换行符生成 xml 签名
【发布时间】:2020-08-11 10:45:02
【问题描述】:

首先,对不起我的英语不好!

我必须对一些 XML 文档进行数字签名以发送给智利 SII,其中包括数字签名。当我在 Windows 中的 JAVA 下开发时,我可以发送文档并获得 OK 作为响应。作为 POST 发送的文档,包括 XML 消息之前的一些标头。如果我使用 \r\n 作为换行符,则响应正常,如果我只使用 \n,我会收到 HTTP 500 响应。所以我决定使用 \r\n

下一步是将我的程序编译并打包到一个 jar 中,然后将它放在 Linux 服务器 中。 当我执行程序并发送文档时,如果我使用 \n 换行符,我会收到一个 HTTP 500 响应,这与我在 Windows 中收到的响应相同。如果我使用 \r\n,我可以发送 xml,但我从服务器收到一条错误消息:“XML 文档结构必须在同一个实体内开始和结束。” 我可以看到 Windows 中已签名的 XML 和 Linux 中已签名的 XML 之间的独特区别是 换行符。就像服务器期待 \r\n,它在 windows 中使用,但是当我在 Linux 中执行它时,它使用 \n 作为换行符。 p>

我可以在我的 java 代码中添加一些神奇的语句来强制使用 \r\n 作为换行符,即使我在 Linux 下执行它也是如此??

注意:我使用的是 java7 和加密库形成签名。

【问题讨论】:

    标签: java xml linux xml-signature


    【解决方案1】:

    如果您使用 PrintWriter 生成发布请求 - 特别是它的 println() 调用 - 您可以覆盖 PrintWriter 以使其使用您希望的换行符分隔符,如下所示:

    static PrintWriter newPrintWriter(Writer out, String lineSep)
    {
        return new PrintWriter(out) {
            public void println() {
                print(lineSep);
            }
        };
    }
    

    然后你可以用类似这样的 Unix/Linux 行分隔符来包装你的邮政编码的输出流:

    try(PrintWriter out = newPrintWriter(yourOutputStream, "\n")) {
       out.println("whatever");
    }
    

    或用于 Windows 样式的行分隔符:

    try(PrintWriter out = newPrintWriter(yourOutputStream, "\r\n")) {
       out.println("whatever");
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 2013-09-22
      相关资源
      最近更新 更多