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;