2015-02-24 57 views
0

我正在使用JAX-WS生成的客戶端(Java)代碼訪問第三方Web服務。 對啓動客戶端會話的服務的調用返回a.o.包含簽名的響應中的令牌。爲了進行身份驗證,後續調用其他服務時需要使用令牌。JAX-WS在令牌簽名中添加名稱空間

我從使用SoapUI得知WS/Endpoint要求令牌按原樣使用......意思是當我將Token(這是一條大線)從最初的響應中複製到任何請求時,一切正常我喜歡下一個。

現在我在我的JAX-WS客戶端中也這樣做了。我檢索了一個Token(我從Fiddler捕獲的響應中複製了它),然後在使用SoapUI進行的後續調用中成功進行了測試。

但是,當使用JAX-WS客戶端對服務執行後續調用時,令牌中的簽名部分會發生更改。它應該看起來像:

<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">...</Signature> 

但(捕捉與提琴手的請求時),它現在看起來像:

<Signature:Signature xmlns:Signature="http://www.w3.org/2000/09/xmldsig#" xmlns="http://www.w3.org/2000/09/xmldsig#">...</Signature:Signature> 

顯然,根據WS /端點所以現在我想這是不能接受的要知道:

  • 爲什麼令牌被編組回來這種方式?
  • 更重要的是,如何防止我的客戶做到這一點?

在此先感謝!

回答

1

你測試過了嗎?它應該工作。原始簽名使用了defautl名稱空間(... xmldigsig),JAXB版本使用相同的名稱空間,但明確指出Signature元素屬於該名稱空間(Signature:Signature)。 xml表示簽名位於http://www.w3.org/2000/09/xmldsig#命名空間

您可以使用@XMLSchema對包中的信息,類@XMLType或者在元素內部定製jaxby輸出。 http://blog.bdoughan.com/2010/08/jaxb-namespaces.html

+0

服務返回包含一個響應錯誤消息說令牌無效。我認爲它確實需要像服務提供的那樣。或者,這可能是我認爲我已經處理的WS-A尋址問題了嗎? – Kjeld 2015-02-25 08:30:44

+0

如果您確定要正確發送數據,則需要查看生成的Signature類(如果它不是Signagure,請查看文檔的根目錄),因爲jaxb輸出可以使用我的答案中的Annotations進行控制。 – Zielu 2015-02-25 15:01:54

+0

謝謝,您添加的有關注釋的部分很有幫助,更改package-info.java解決了這一部分。雖然問題還沒有完全解決:顯然,需要添加令牌中的其他名稱空間屬性。另請參閱我的新帖子:[鏈接](http://stackoverflow.com/questions/28761798/how-to-make-changes-in-marshalled-output-in-java-web-service-client) – Kjeld 2015-02-27 09:44:43

0

通過@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; 
相關問題