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

Vla*_*lin 10 java session soap web-services

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

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

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

hom*_*ome 10

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

@Resource
WebServiceContext wsContext;
Run Code Online (Sandbox Code Playgroud)

这里有一个详细的例子.当然,您的客户也必须支持这一点(如果它们是基于JAX-WS的,它可以工作).然而,经验法则是Web服务根本不应该保持任何状态,它们应该表现为无状态.在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 */
    }

}
Run Code Online (Sandbox Code Playgroud)

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