2012-04-18 76 views
3

我有一個獨立的Web服務客戶端。當調用任何web方法時,附加的「cookie」字符串必須是隱含地傳遞給WS的(而不是web方法參數)。另一端的WS必須能夠獲得字符串並使用它。這怎麼能實現?每個網絡服務呼叫自動傳遞一個cookie

我調用該服務以下列方式:

Service srv = Service.create(new URL(WSDL), QNAME); 
myClassPort = srv.getPort(MyClass.class); 

我需要的是把一些代碼的第一行之前,這將使客戶端每次調用一些偏遠的時間發送這種「餅乾」的字符串方法通過myClassPort。謝謝。

回答

6

默認JAX-WS Web服務和客戶端是無狀態的。當客戶端發出請求時,服務器響應並在連接上設置一個cookie,如果它參與了會話。但是,JAX-WS客戶端忽略該cookie並且服務器將後續請求視爲新的交互。當會話啓用時,JAX-WS客戶端會爲每個後續請求發送相同的cookie,以便服務器可以跟蹤客戶端會話。

所以你不應該使用cookie或HTTP會話與Web服務。返回一個令牌ID作爲響應的一部分;那麼客戶端可以將其與下一個請求一起發送。

總之:

JAX-WS Web服務客戶端必須被配置爲維護會話信息(如餅乾),使用javax.xml.ws.session.maintain財產。其他Web服務棧可能有類似的機制。

在服務器端

JAX-WS使用由Java平臺(JSR 250通用註解定義一些方便的註釋,注入Web服務上下文和聲明生命週期方法。 WebServiceContext保存與正被服務的請求有關的上下文信息。

您無需執行javax.xml.rpc.server.ServiceLifecycle。使用JAX-WS Web服務,您只需用@Resource標記字段或方法即可。類型元素必須是java.lang.Objectjavax.xml.ws.WebServiceContext

@WebService 
public class HelloWorld { 
    @Resource 
    private WebServiceContext wsContext; 
    public void sayHello(){ 
     MessageContext mc = wsContext.getMessageContext(); 
     HttpSession session = ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession(); 

    } 
} 
+0

「所以你不應該在Web服務中使用cookies或HTTP會話,作爲響應的一部分返回一個令牌ID,然後客戶端可以將下一個請求一起發送。 Thx爲您的答案!你能解釋一下你爲什麼提到這個嗎?這正是讓客戶端隱式發送一些ID **而不是每個Web方法的明確參數的要點。 – azerIO 2012-04-19 09:43:00

+2

在我的建議中,客戶端必須明確發送令牌ID。如果您可以控制所有客戶端,Cookie可能是一種選擇,如果不是這樣的話,Cookie通常不適用於Web服務。 – andih 2012-04-19 11:13:11

+1

您能否在我可以控制所有客戶端的用例中添加更多信息?是否可以使用**'java.net.CookieHandler' **,或者將'javax.xml.ws.session.maintain'設置爲最佳方法? – mike 2015-12-10 15:55:46