Java 如何管理用户';使用web服务时的会话?

Java 如何管理用户';使用web服务时的会话?,java,web-services,session,soap,Java,Web Services,Session,Soap,如果用户通过web浏览器使用web应用程序,则该用户的会话由应用程序服务器管理。它负责会话的创建、验证、超时、处理等 据我所知,在另一种情况下,如果用户通过远程客户端使用应用程序并使用SOAP web服务,则不存在这样的机制 因此,问题是,在使用web服务的情况下,我们如何管理用户的会话,并实现相同的会话管理机制,如无效、延长、处置?假设您使用JAX-WS和SOAP/HTTP,那么也可以使用容器管理的安全性(例如会话cookie)。你只需要注入你的服务。它允许访问所有HTTP环境变量: @Res

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

据我所知,在另一种情况下,如果用户通过远程客户端使用应用程序并使用SOAP web服务,则不存在这样的机制


因此,问题是,在使用web服务的情况下,我们如何管理用户的会话,并实现相同的会话管理机制,如无效、延长、处置?

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

@Resource
WebServiceContext wsContext;
这里有一个详细的例子。当然,您的客户机也必须支持这一点(如果它们是基于JAX-WS的,那么它就可以工作)。然而,经验法则是web服务根本不应该维护任何状态,它们的行为应该是无状态的。看

编辑:您可以通过以下方式访问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)。

我想您所说的是如何维护web服务会话(声明完整的web服务)
在这种情况下,以下链接可以帮助您:

  • Web服务不支持会话状态以实现高可伸缩性,Web服务设计为无状态
  • 会话状态处理不是SOAP规范的一部分。cookie存储一个作为会话标识符的令牌。传递会话标识符的方法有很多:作为HTTP cookie、SOAP头或SOAP消息体中的元素
  • SOAP头是独立于传输的,但它要求SOAP客户端和服务就SOAP头的格式达成一致,并且要求SOAP客户端和SOAP服务器实现都支持SOAP头。如果使用SOAP主体传递会话id,则由服务(即应用程序代码)在每次调用时重新建立状态。有状态处理会使跨SOAP的互操作性变得更具挑战性,但它确实有效。检查SOAP实现的功能
因此,如果我没有弄错的话,我只能借助
WebServiceContext
获取
上下文。例如,是否可能创建新会话并以某种方式将其存储到容器中?@sainr:如果我没记错的话-是的。我会修改我的答案。非常感谢你的回答,我会试试。@home因此,使用WS作为后端的应用程序只通过前端(例如localStorage)维护其会话?我认为使用浏览器存储是不好的,因为它可以被使用它的其他应用程序覆盖,并且必须进行加密,而在服务器上,它不会被覆盖谢谢你的回答,上面的链接很有帮助。@jaxb链接现在已失效。