如果用户通过Web浏览器使用Web应用程序,则用户的会话由应用程序服务器管理。它负责会话创建,验证,超时,处理等。
据我所知,在另一种情况下没有这样的机制,如果用户通过远程客户端使用app并使用SOAP Web服务。
所以问题是,我们如何在Web服务的情况下管理用户的会话,并实现相同的会话管理机制,如失效,延长,处置?
答案 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)