使用Web服务时如何管理用户的会话?

时间:2011-11-07 12:59:37

标签: java web-services session soap

如果用户通过Web浏览器使用Web应用程序,则用户的会话由应用程序服务器管理。它负责会话创建,验证,超时,处理等。

据我所知,在另一种情况下没有这样的机制,如果用户通过远程客户端使用app并使用SOAP Web服务。

所以问题是,我们如何在Web服务的情况下管理用户的会话,并实现相同的会话管理机制,如失效,延长,处置?

3 个答案:

答案 0 :(得分:9)

假设您使用JAX-WS和SOAP / HTTP,则可以使用容器管理的安全性(例如会话cookie)。您只需在服务中注入WebServiceContext即可。它允许访问所有HTTP环境变量:

@Resource
WebServiceContext wsContext;

有一个详细的例子here。当然,您的客户也必须支持这一点(如果它们是基于JAX-WS的,它可以工作)。然而,经验法则是Web服务根本不应该保持任何状态,它们应该表现为无状态。请参阅this on SO

编辑:您可以通过以下方式访问ServletRequest:

@WebMethod
public void foo() {
    final MessageContext mc = this.wsContext.getMessageContext();
    final ServletRequest sr = mc.get(MessageContext.SERVLET_REQUEST);

    /* works if this is a HTTP(s) request */
    if (sr != null && sr instanceof HttpServletRequest) {
        final HttpServletRequest hsr = (HttpServletRequest) sr;
        hsr.getSession(true);

        /* ... */

    } else {
        /* do some exceptional stuff */
    }

}

上面创建的会话应该与“标准”Web会话完全相同。您必须确保您的客户也理解这一点。他们必须在每次后续调用时提交会话标识符(cookie)。

答案 1 :(得分:2)

我认为您正在讨论如何维护Web服务会话(状态完整的Web服务)。
在这种情况下,以下链接可以帮助您:
https://blogs.oracle.com/sujit/entry/ws_addressing_and_stateful_webservice

答案 2 :(得分:2)

  • Web Service不支持会话状态以实现高可伸缩性,Web服务设计为无状态
  • 会话状态处理不是SOAP规范的一部分。 cookie存储用作会话标识符的令牌。有许多方法可以传递会话标识符:作为HTTP cookie,作为SOAP标头,或作为SOAP消息体中的元素。
  • SOAP标头与传输无关,但它要求SOAP客户端和服务同意SOAP标头的格式,并且要求SOAP客户端和SOAP服务器实现都支持SOAP标头。如果您使用SOAP主体传递会话ID,则由服务(即您的应用程序代码)决定是否在每次调用时重新建立状态。有状态处理可以使跨SOAP互操作性更具挑战性,但它确实有效。检查SOAP实现的功能。 source