我對編寫Web服務相當陌生。我正在使用JAXWS處理SOAP服務。我希望能夠讓用戶登錄並在我的服務中知道哪個用戶正在發出命令。換句話說,有一些會話處理。JAXWS和會話
我看到要做到這一點的一種方法是使用cookie並從我的web服務訪問HTTP層。然而,這將依賴於使用HTTP作爲傳輸層(我知道HTTP幾乎總是傳輸層,但我是純粹主義者)。
有更好的方法讓服務層不知道傳輸層嗎?有什麼方法可以用servlet過濾器來完成這個任務嗎?我希望答案儘可能像框架一樣不可知。
我對編寫Web服務相當陌生。我正在使用JAXWS處理SOAP服務。我希望能夠讓用戶登錄並在我的服務中知道哪個用戶正在發出命令。換句話說,有一些會話處理。JAXWS和會話
我看到要做到這一點的一種方法是使用cookie並從我的web服務訪問HTTP層。然而,這將依賴於使用HTTP作爲傳輸層(我知道HTTP幾乎總是傳輸層,但我是純粹主義者)。
有更好的方法讓服務層不知道傳輸層嗎?有什麼方法可以用servlet過濾器來完成這個任務嗎?我希望答案儘可能像框架一樣不可知。
我對SOAP服務使用JAXWS工作。我希望能夠讓用戶登錄並在我的服務中知道哪個用戶正在發出命令。換句話說,有一些會話處理。
傳統的Web服務在本質上無狀態的,還有在Web服務中沒有會話處理(其中有由甭做識別呼叫者)。
如果你想需要你的用戶進行身份驗證調用的服務,傳統的做法是:
在服務器端:
的一段時間後
正如您所說,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();
}
}
謝謝,我想我可以使用這種模式將上面提到的令牌傳遞給我的服務層。 – Pace 2010-05-02 02:30:38
傑出的答案。非常感謝你。 – Pace 2010-05-02 02:29:02