基本上問題是這樣的:
存在一個存儲數據庫過程,它將一個用戶名作爲參數,並根據它生成一些XML數據。它被一個在不安全的Web服務中沒有參數的方法調用(我們稱之爲Web服務WSA)。還有另一個Web服務(我們稱之爲WSB),它應該叫做WSA。在這種設置中,WSA只能由WSB調用,而不能由其他人調用。 WSB是用戶所稱的,它是他們獲取所需XML數據的方式。 Web服務部署在OC4J上,並且他們已啓用安全性。 WSB由OC4J保護,並通過提供OC4J用戶的用戶名和密碼進行訪問。
測試Web服務時,OC4J爲您提供一個表單,您可以在調用Web服務之前輸入登錄信息。如果選擇在標題中包含安全信息並在調用服務之前預覽消息,則會在消息中包含用戶名和密碼。
我的問題是,我無法獲得安全信息(或至少用戶名)到達端點實現和調用存儲過程。 到目前爲止,我已經創建了WSA,創建了一個引用它的Web服務代理,並基於該代理創建了WSB。
我迄今試圖獲取用戶名(以及爲什麼它不工作):如何在Web服務請求之間發送用戶名?
只好WSA實現
javax.xml.rpc.server.ServiceLifecycle
。這爲WSA提供了一個javax.xml.rpc.server.ServletEndpointContext
的實例,它爲我提供了一個java.security.Principal
。但是,如果我調用WSB(它又調用WSA),那麼Principal
是null
。如果我保護WSA並直接調用它,則Pricipal
不爲空幷包含用戶(但它不能解決問題,因爲我需要調用WSB而不是WSA)。爲兩個服務創建了處理程序(擴展爲
javax.xml.rpc.handler.GenericHandler
),這兩個服務都應該能夠處理該消息。有一件事讓我很困惑。正確調用處理程序方法 - WSB處理程序處理請求,然後WSA處理程序處理請求,然後WSA處理程序處理響應,最後WSB處理程序處理響應。但是當我嘗試將消息打印到每個步驟中的文件時,我發現即使在第一步(當WSB處理請求時),消息中也沒有安全信息。沒有用戶名,什麼也沒有。在調用服務之前預覽請求消息時,消息實際上與調用頁面上顯示的消息大不相同。通過使用
@Resource
註釋嘗試注入WebServiceContext
的實例,但顯然OC4J不支持這一點。
如果任何人都可以闡明我可能做錯什麼的地方,我會非常感激。