我有一个独立的Web服务客户端。在调用任何Web方法时,附加的“cookie”字符串必须隐式(而不是作为Web方法参数)传递给WS。另一端的WS必须能够获取字符串并使用它。如何实现这一目标?
我以下列方式调用服务:
Service srv = Service.create(new URL(WSDL), QNAME);
myClassPort = srv.getPort(MyClass.class);
我需要的是在第一行之前放置一些代码,这会使客户端每次通过myClassPort调用一些远程方法时都会发送这个“cookie”字符串。 THX。
答案 0 :(得分:6)
默认情况下JAX-WS
Web服务和客户端是无状态的。当客户端发出请求时,如果服务器参与会话,则服务器会响应并在连接上设置cookie。但是,JAX-WS
客户端忽略该cookie,服务器将后续请求视为新的交互。启用会话后,JAX-WS
客户端会为每个后续请求发送相同的cookie,以便服务器可以跟踪客户端会话。
因此,您不应该使用cookie或HTTP会话与Web服务。返回令牌ID作为响应的一部分;然后客户端可以将其与下一个请求一起发送。
反正:
必须使用javax.xml.ws.session.maintain
属性将JAX-WS Web服务客户端配置为维护会话信息(例如cookie)。
其他Web服务堆栈可能具有类似的机制。
在服务器端
JAX-WS使用由 Java平台的公共注释(JSR 250)定义的一些方便的注释来注入Web服务上下文并声明生命周期方法。
WebServiceContext
保存与正在提供的请求有关的上下文信息。
您无需实施javax.xml.rpc.server.ServiceLifecycle
。使用JAX-WS
Web服务,您只需使用@Resource
标记字段或方法即可。类型元素必须是java.lang.Object
或javax.xml.ws.WebServiceContext
。
@WebService
public class HelloWorld {
@Resource
private WebServiceContext wsContext;
public void sayHello(){
MessageContext mc = wsContext.getMessageContext();
HttpSession session = ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
}
}
答案 1 :(得分:0)
这个问题有一些误导性的答案,因此我将尝试强调当前的最佳做法。其中大多数建议都是OWASP安全指南的一部分,我强烈建议任何从事Web开发的人员进行审核。
1)始终使用临时(会话范围)cookie。
2)所有cookie都应受到保护和加密。
3)请勿在请求有效负载中传递令牌
4)对于任何返回可能发送回服务器的数据的请求,请在回复中包含一个nonce(一次性令牌)。
5)以后的请求应该(必须)包含nonce和cookie
同样,我的建议是审查OWASP指南并相应地进行。 您可能希望使用服务提供商进行身份验证 - 这比酿造您自己的解决方案要聪明得多,因为有数百万个细节都必须正确。 Auth0.com就是其中之一。