JAXWS和会话

我很擅长编写Web服务。 我正在使用JAXWS开发SOAP服务。 我希望能够让用户登录并在我的服务中知道哪个用户正在发出命令。 换句话说,有一些会话处理。

我见过这样做的一种方法是使用cookie并从我的Web服务访问HTTP层。 但是,这依赖于使用HTTP作为传输层(我知道HTTP几乎总是传输层,但我是纯粹的)。

是否有更好的方法可以使服务层不知道传输层? 有没有办法用servletfilter完成这个? 我希望答案尽可能与框架无关。

我正在使用JAXWS开发SOAP服务。 我希望能够让用户登录并在我的服务中知道哪个用户正在发出命令。 换句话说,有一些会话处理。

传统的Web服务本质上是无状态的,Web服务中没有会话处理 (据说与识别调用者没有任何关系)。

如果您要求对您的用户进行身份validation以调用服务,则传统方法是:

  1. 公开返回身份validation令牌的“身份validation”Web服务(传递用户凭据)。
  2. 让用户首先调用此身份validation。
  3. 让用户在后续“业务”Web服务调用中在自定义标头中传递令牌。

在服务器端:

  1. 拒绝任何不包含有效令牌的呼叫。
  2. 在一段时间不活动后使令牌失效

您可以为此方法实现自定义解决方案(这是一种高度可互操作的解决方案)。 或者您可以使用提供类似开箱即用function的WS-Security / UsernameTokens 。 WS-Security是一个标准(Metro实现它),它不是“框架”特定的。

如您所述,servletfilter可以提供解决方案的基础。 使用filter将当前会话详细信息(例如会话上下文映射)存储在threadLocal存储中。 这是作为您的应用程序类实现的,因此与传输无关。 您的服务只是使用静态方法来获取当前上下文,而不知道它来自何处。

例如

class ServiceSessionContext { static ThreadLocal local = new ThreadLocal(); // context set by the transport layer, eg 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(); } }