Java 为什么JAX-WS服务器端在SOAP主体部分内更改名称空间?

Java 为什么JAX-WS服务器端在SOAP主体部分内更改名称空间?,java,namespaces,jax-ws,server-side,Java,Namespaces,Jax Ws,Server Side,我正在尝试为web服务使用自定义签名。其思想是在服务器端和客户端添加一个处理程序,用于创建/验证自定义签名。假设整个文件都应该签名 问题是JAX-WS服务器端在接收到SOAP请求后(通过添加/重复名称空间声明)改变了 以下是TCP/IP监视器在服务器端捕获的简化SOAP请求: <?xml version="1.0" standalone="no"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope

我正在尝试为web服务使用自定义签名。其思想是在服务器端和客户端添加一个处理程序,用于创建/验证自定义签名。假设整个文件都应该签名

问题是JAX-WS服务器端在接收到SOAP请求后(通过添加/重复名称空间声明)改变了

以下是TCP/IP监视器在服务器端捕获的简化SOAP请求:

<?xml version="1.0"  standalone="no"?>
  <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
    <S:Body>
      <ns2:getServerName xmlns:ns2="http://ws.example.com/">
        <arg0>someText</arg0>
      </ns2:getServerName>
    </S:Body>
  </S:Envelope>
结果是:

<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Header/>
  <S:Body>
      <ns2:getServerName
          xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://ws.example.com/">
        <arg0>someText</arg0>
      </ns2:getServerName>
  </S:Body>
</S:Envelope>

一些文字
如您所见,xmlns:S=”http://schemas.xmlsoap.org/soap/envelope/ 对元素重复。这将使包括元素在内的任何签名无效

所以

  • 为什么会这样
  • 可以预防吗
  • 有没有更好的方法来应用自定义签名(通常)

谢谢。

如果您实际使用的是XML解析器(而不是尝试使用字符串操作),额外的名称空间定义无效。如果您正在基于XML的文本表示创建某种签名,有很多事情会让您感到不安。也许您应该查看现有的签名工具?@parsifal thx,但首先目标是使用我的自定义签名。因此,我不能使用现有的签名工具:)此外,除了使用xml的文本表示之外,我看不到其他方法。因为文本表示是从客户端发送到服务器的唯一内容。恐怕您需要对xml有更深入的理解才能实现这一点。我建议从这里开始:@parsifal thx获取提示,但我知道c14n.可能遗漏了什么。这实际上是另一个好问题:c14n是否应该规范化重复命名空间声明的情况?我认为c14n显然不会这样做,因为这会改变文档的语义。(请参阅)XML规范化的要点是处理文档中包含的信息,而不是字符串表示(有许多可能的形式)。至于您的附加问题,
xmlns:S
是一个,因此前缀重写不包括在内。应该忽略该声明。
<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Header/>
  <S:Body>
      <ns2:getServerName
          xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://ws.example.com/">
        <arg0>someText</arg0>
      </ns2:getServerName>
  </S:Body>
</S:Envelope>