簡體   English   中英

CXF:為CXF SOAP / REST Web服務的WSDL和WADL響應添加隱式標頭

[英]CXF: Add implicit headers to WSDL and WADL responses for a CXF SOAP/REST web service

我正在嘗試為CXF SOAP / REST Web服務(由Camel管理)的WSDL和WADL響應添加隱式標頭。

(這些不一定是安全標題....)

通過“隱式標頭”,我的意思是,點擊服務的WSDL / WADL URL將顯示客戶端期望在請求中提供標頭。

但我不想在Web服務的簽名中明確指定標頭。

我有一個CXF攔截器,它為每個SOAP / REST響應添加一個隱式頭。

因此,由於WSDL / WADL文檔是作為對某些GET請求的響應而發送的,所以我想以某種方式使用類似的攔截器將頭數據添加到WSDL / WADL響應中。 我怎么能進行這樣一個奇妙的壯舉?

這是CXF攔截器,它為每個SOAP / REST響應添加一個隱式頭:

public class MyInterceptor extends AbstractPhaseInterceptor<Message> {

    public MyInterceptor()
    {
        super(Phase.RECEIVE);
    }

    @Override
    public void handleMessage(Message message)
    {   
        try
        {
            //soap
            if (message instanceof SoapMessage)
            {               
                List<Header> headers = ((SoapMessage)message).getHeaders();

                Header dummyHeader = new Header(new QName("uri:org.apache.cxf", "dummy"), "decapitated", new JAXBDataBinding(String.class));

                headers.add(dummyHeader);
            }
            //rest
            else
            {
                Map<String, List> headers = (Map<String, List>) message.get(Message.PROTOCOL_HEADERS);

                String dummyHeader = "decapitated";

                headers.put("dummy", Collections.singletonList(dummyHeader));
            }

        }
        catch (JAXBException e)
        {
            throw new Fault(e);
        }
    }

    @Override
    public void handleFault(Message messageParam)
    {
    }
}

CXF 2.7.4

在CXF中,WSDL是通過一個名為WSDLGetInterceptor鏈中的Interceptor生成的,它位於READ鏈中。

它的基本設計是

  1. 檢查呼叫是否是HTTP GET
  2. 准備輸出消息以返回
  3. 訪問wsdl(來自Java或來自靜態資源)
  4. 將wsdl寫入輸出消息
  5. 中斷攔截器鏈以提供輸出消息

采取行動的最簡單方法是搶占這個攔截器,使其無法通過之前注冊您自己的實現來完成其工作。

刪除標准的CXF攔截器在默認的總線上是一件“難事”(最簡單的方法是注冊你自己的攔截器,把它放在鏈中,然后讓它刪除其他攔截器,如message.getInterceptorChain().remove(removeInterceptor);

但是在標准WSDL攔截器之前添加自己的東西很簡單:

public MyWSDLGetInterceptor() {
    super(Phase.READ);
    addBefore(WSDLGetInterceptor.class.getName());
}

MyWSDLGetInterceptor將擴展標准的WSDLGetInterceptor ,您只需覆蓋:

public Document getDocument(Message message,
                            String base,
                            Map<String, String> params,
                            String ctxUri,
                            EndpointInfo endpointInfo) {
    Document domDocument = super.getDocument(message, base, params, ctxUri, endpointInfo);
    domDocument.getChildNodes(); // Whatever you need to add remove
    return domDocument; // Once modified
}

您可以動態修改生成的DOM Document(添加/創建DOM節點)或通過XSLT,無論您最喜歡什么,您都可以通過標准API處理標准XML。

CXF 2.7.x(其中x大於4且<10)

校長是相同的,但攔截器的工作方式不同。

  1. 它(在私有方法中)將WSDL作為DOM Document作為out消息屬性
  2. 它清除所有攔截器的輸出攔截器鏈(絕對必要除外)
  3. 它在輸出鏈中注冊了一個WSDLGetOutInterceptor
  4. 它會停止IN鏈並進入停止鏈
  5. WSDLGetOutInterceptor執行其序列化作業

所以它有點難/干凈。 但是使用相同的預占基礎攔截器的原則(之前注冊自己),你可以通過outMessage.get(DOCUMENT_HOLDER)訪問WSDL來覆蓋cleanUpOutInteceptors來操縱消息,就像在2.7.4情況下一樣。

WADL

對不起,我沒有專業知識,但我猜CXF對兩者都有相同的架構......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM