在 LINUX 中用 windows line-break 运行 生成 xml-signature

Producing xml-signature with windows line-break running in LINUX

首先,抱歉我的英语不好!!

我必须对一些 XML 文件进行数字签名才能发送给智利 SII,其中包括数字签名。当我在 JAVAWindows 下开发时,我可以发送文档并得到 OK 作为响应。文档作为 POST 发送,包括 XML 消息之前的一些 headers。如果我使用 \r\n 作为 line-break,响应是可以的,如果我只使用 \n,我得到一个HTTP 500 响应。所以我决定使用 \r\n

下一步是编译我的程序并将其打包到一个 jar 中,并将其放置在 Linux 服务器 中。 当我执行程序并发送文档时,如果我使用 \n line-break,我将收到 HTTP 500 响应,与我在 Windows 中收到的响应相同。如果我使用 \r\n,我可以发送 xml 但我从服务器收到一条错误消息:"XML 文档结构必须在同一实体内开始和结束。" Windows 中带符号的 XML 和 Linux 中带符号的唯一区别是 line-break 字符 。这就像服务器期待 \r\n,它在 windows 中使用,但是当我在 Linux 中执行它时,它被使用 \n 作为 line-break .

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

注意:我使用 java7 和加密库构成签名。

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

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

然后你可以为 post 代码包装你的输出流,用这样的东西作为 Unix/Linux 行分隔符:

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

或 Windows 样式行分隔符:

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