【问题标题】:How can I manage users' sessions when I use web services?使用 Web 服务时如何管理用户的会话?
【发布时间】:2011-11-07 12:59:37
【问题描述】:

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

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

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

【问题讨论】:

    标签: java web-services session soap


    【解决方案1】:

    假设您使用 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 */
        }
    
    }
    

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

    【讨论】:

    • 所以如果我没记错的话,我只能在WebServiceContext 的帮助下使用get 上下文。例如,是否有可能创建新会话并以某种方式将其存储在容器中?
    • @sainr:如果我没记错的话——是的。我会修改我的答案。
    • 非常感谢您的回答,我试试看。
    • @home 因此,使用 WS 作为后端的应用程序仅通过前端来维护它们的会话,例如本地存储?
    • 我认为使用浏览器存储很糟糕,因为它可以被使用它的其他应用程序覆盖,并且必须加密,而在服务器上,它不会被覆盖
    【解决方案2】:

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

    【讨论】:

    • 感谢您的回答,上面的链接很有帮助。
    • @jaxb 链接现已失效。
    【解决方案3】:
    • Web 服务不支持会话状态以实现高可扩展性,Web 服务设计为无状态
    • 会话状态处理不是 SOAP 规范的一部分。 cookie 存储充当会话标识符的令牌。有多种方法可以传递会话标识符:作为 HTTP cookie、作为 SOAP 标头或作为 SOAP 消息正文中的元素。
    • SOAP 标头与传输无关,但它要求 SOAP 客户端和服务就 SOAP 标头的格式达成一致,并且要求 SOAP 客户端和 SOAP 服务器实现都支持 SOAP 标头。如果您使用 SOAP 主体来传递会话 id,那么由服务(即您的应用程序代码)来重新建立每次调用的状态。有状态处理可以使跨 SOAP 互操作性更具挑战性,但它确实有效。检查 SOAP 实现的功能。 source

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2017-05-15
      • 1970-01-01
      • 2015-10-29
      相关资源
      最近更新 更多