【发布时间】:2011-11-07 12:59:37
【问题描述】:
如果用户通过网络浏览器使用网络应用程序,用户的会话由应用程序服务器管理。它负责会话的创建、验证、超时、处置等。
据我所知,如果用户通过远程客户端使用应用程序并使用 SOAP Web 服务,则在另一种情况下没有这样的机制。
那么问题来了,我们如何在 Web 服务的情况下管理用户的会话,并实现相同的会话管理机制,如失效、延长、处置?
【问题讨论】:
标签: java web-services session soap
如果用户通过网络浏览器使用网络应用程序,用户的会话由应用程序服务器管理。它负责会话的创建、验证、超时、处置等。
据我所知,如果用户通过远程客户端使用应用程序并使用 SOAP Web 服务,则在另一种情况下没有这样的机制。
那么问题来了,我们如何在 Web 服务的情况下管理用户的会话,并实现相同的会话管理机制,如失效、延长、处置?
【问题讨论】:
标签: java web-services session soap
假设您使用 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 上下文。例如,是否有可能创建新会话并以某种方式将其存储在容器中?
我认为您在谈论如何维护网络服务会话(状态完整的网络服务)。
在这种情况下,以下链接可以帮助您:
https://blogs.oracle.com/sujit/entry/ws_addressing_and_stateful_webservice
【讨论】:
【讨论】: