我正在尝试对 Web 服务使用自定义签名。这个想法是在服务器和客户端添加一个处理程序,以创建/验证自定义签名。假设整个应该签名。
问题是 JAX WS 服务器端在接收到 SOAP 请求后改变了(通过添加/重复命名空间声明)。
以下是由 TCP/IP Monitor 在服务器端捕获的简化 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>
服务器端只有一个处理程序处于活动状态,第一个操作是漂亮的格式输出:
public boolean handleMessage(SOAPMessageContext context) {
try {
SOAPMessage soapMsg = context.getMessage();
SOAPEnvelope soapEnv = soapMsg.getSOAPPart().getEnvelope();
nodeToPrettyFormat(soapEnv, null); //just a System.out in pretty format
结果输出是:
<?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/ 是重复的。这会使包括元素在内的任何签名无效。
所以,
- 为什么会这样?
- 可以预防吗?
- 有没有更好的主意如何应用自定义签名(通常)?
谢谢你。