2010-05-01 93 views
2

我對編寫Web服務相當陌生。我正在使用JAXWS處理SOAP服務。我希望能夠讓用戶登錄並在我的服務中知道哪個用戶正在發出命令。換句話說,有一些會話處理。JAXWS和會話

我看到要做到這一點的一種方法是使用cookie並從我的web服務訪問HTTP層。然而,這將依賴於使用HTTP作爲傳輸層(我知道HTTP幾乎總是傳輸層,但我是純粹主義者)。

有更好的方法讓服務層不知道傳輸層嗎?有什麼方法可以用servlet過濾器來完成這個任務嗎?我希望答案儘可能像框架一樣不可知。

回答

5

我對SOAP服務使用JAXWS工作。我希望能夠讓用戶登錄並在我的服務中知道哪個用戶正在發出命令。換句話說,有一些會話處理。

傳統的Web服務在本質上無狀態的,還有在Web服務中沒有會話處理(其中有由甭做識別呼叫者)。

如果你想需要你的用戶進行身份驗證調用的服務,傳統的做法是:

  1. 揭露返回認證令牌的「認證」 Web服務(通過用戶憑據)。
  2. 讓用戶首先調用此認證。
  3. 讓用戶在後續調用「業務」Web服務時將自定義標頭中的令牌傳遞給用戶。

在服務器端:

  1. 拒絕不包含有效憑證的電話。活動

的一段時間後

  • 的Invalidate令牌可以實現這種方法自定義解決方案(這是一個具有高度互操作性的解決方案)。或者您可以使用WS-Security/UsernameTokens,它提供了類似的開箱即用功能。 WS-Security是一個標準(Metro實現它),它不是「框架」特定的。

  • +0

    傑出的答案。非常感謝你。 – Pace 2010-05-02 02:29:02

    1

    正如您所說,servlet過濾器可以提供解決方案的基礎。使用過濾器將當前會話詳細信息(例如會話上下文映射)存儲在threadLocal存儲中。這是作爲你的應用程序類來實現的,所以傳輸是不可知的。您的服務只是使用靜態方法來獲取當前上下文,而不知道它來自哪裏。

    E.g.

    class ServiceSessionContext 
    { 
        static ThreadLocal<Map> local = new ThreadLocal<Map>(); 
    
        // context set by the transport layer, e.g. servlet filter 
        static public void setContext(Map map) 
        { 
         local.put(map); 
        } 
    
        // called when request is complete 
        static public void clearContext() 
        { 
         local.put(null); 
        } 
    
        // context fetched by the service 
        static public Map getContext() 
        { 
         return local.get(); 
        } 
    }  
    
    +0

    謝謝,我想我可以使用這種模式將上面提到的令牌傳遞給我的服務層。 – Pace 2010-05-02 02:30:38