JAX-WS 在令牌签名中添加命名空间
JAX-WS adds namespace in Signature of token
我正在使用 JAX-WS 生成的客户端 (Java) 代码访问第三方 Web 服务。
对启动客户端会话的服务的调用 returns 响应中的令牌 a.o,包含签名。出于身份验证目的,后续调用其他服务时需要令牌。
我从使用 SoapUI 中了解到 WS/Endpoint 需要按原样使用令牌...这意味着当我从初始响应中逐字复制令牌(这是一大行)时一切正常无论我接下来想提出什么要求。
现在我正在我的 JAX-WS 客户端中做同样的事情。我检索了一个令牌(我从使用 Fiddler 捕获的响应中复制了它)并在随后的调用中使用 SoapUI 成功测试了它。
但是,当使用 JAX-WS 客户端执行对服务的后续调用时,令牌中的签名部分会发生变化。它应该看起来像:
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">...</Signature>
但是(当使用 Fiddler 捕获请求时)它现在看起来像:
<Signature:Signature xmlns:Signature="http://www.w3.org/2000/09/xmldsig#" xmlns="http://www.w3.org/2000/09/xmldsig#">...</Signature:Signature>
根据 WS/Endpoint 显然这是不可接受的,所以现在我想知道:
- 为什么令牌以这种方式编组回来?
- 更重要的是,我怎样才能阻止我的客户这样做?
提前致谢!
你测试了吗?尽管如此,它应该可以工作。原始签名使用 defautl 命名空间 (...xmldigsig),JAXB 版本使用相同的命名空间,但明确表示 Signature 元素属于该命名空间 (Signature:Signature)。效果是一样的,都是xml表示Signature在http://www.w3.org/2000/09/xmldsig#命名空间
您可以在包信息上使用@XMLSchema 自定义jaxby 输出,在class 或元素内部使用@XMLType。
http://blog.bdoughan.com/2010/08/jaxb-namespaces.html
在@Zielu 的帮助下,我能够通过更改 package-info.java(在生成文件的包中)来解决这个问题,如下所示:
@javax.xml.bind.annotation.XmlSchema(
namespace = "http://namespaceofthirdparty-asingeneratedversionof package-info.java"
, xmlns = {
@javax.xml.bind.annotation.XmlNs(namespaceURI = "http://www.w3.org/2000/09/xmldsig#", prefix = "")
}
, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) package com.where.generated.files.are;
我正在使用 JAX-WS 生成的客户端 (Java) 代码访问第三方 Web 服务。 对启动客户端会话的服务的调用 returns 响应中的令牌 a.o,包含签名。出于身份验证目的,后续调用其他服务时需要令牌。
我从使用 SoapUI 中了解到 WS/Endpoint 需要按原样使用令牌...这意味着当我从初始响应中逐字复制令牌(这是一大行)时一切正常无论我接下来想提出什么要求。
现在我正在我的 JAX-WS 客户端中做同样的事情。我检索了一个令牌(我从使用 Fiddler 捕获的响应中复制了它)并在随后的调用中使用 SoapUI 成功测试了它。
但是,当使用 JAX-WS 客户端执行对服务的后续调用时,令牌中的签名部分会发生变化。它应该看起来像:
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">...</Signature>
但是(当使用 Fiddler 捕获请求时)它现在看起来像:
<Signature:Signature xmlns:Signature="http://www.w3.org/2000/09/xmldsig#" xmlns="http://www.w3.org/2000/09/xmldsig#">...</Signature:Signature>
根据 WS/Endpoint 显然这是不可接受的,所以现在我想知道:
- 为什么令牌以这种方式编组回来?
- 更重要的是,我怎样才能阻止我的客户这样做?
提前致谢!
你测试了吗?尽管如此,它应该可以工作。原始签名使用 defautl 命名空间 (...xmldigsig),JAXB 版本使用相同的命名空间,但明确表示 Signature 元素属于该命名空间 (Signature:Signature)。效果是一样的,都是xml表示Signature在http://www.w3.org/2000/09/xmldsig#命名空间
您可以在包信息上使用@XMLSchema 自定义jaxby 输出,在class 或元素内部使用@XMLType。 http://blog.bdoughan.com/2010/08/jaxb-namespaces.html
在@Zielu 的帮助下,我能够通过更改 package-info.java(在生成文件的包中)来解决这个问题,如下所示:
@javax.xml.bind.annotation.XmlSchema(
namespace = "http://namespaceofthirdparty-asingeneratedversionof package-info.java"
, xmlns = {
@javax.xml.bind.annotation.XmlNs(namespaceURI = "http://www.w3.org/2000/09/xmldsig#", prefix = "")
}
, elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) package com.where.generated.files.are;