Java 为什么JAX-WS服务器端在SOAP主体部分内更改名称空间?
我正在尝试为web服务使用自定义签名。其思想是在服务器端和客户端添加一个处理程序,用于创建/验证自定义签名。假设整个文件都应该签名 问题是JAX-WS服务器端在接收到SOAP请求后(通过添加/重复名称空间声明)改变了 以下是TCP/IP监视器在服务器端捕获的简化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
<?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>