每次Web服务调用自动传递cookie

时间:2012-04-18 16:19:00

标签: web-services soap jax-ws

我有一个独立的Web服务客户端。在调用任何Web方法时,附加的“cookie”字符串必须隐式(而不是作为Web方法参数)传递给WS。另一端的WS必须能够获取字符串并使用它。如何实现这一目标?

我以下列方式调用服务:

Service srv = Service.create(new URL(WSDL), QNAME);
myClassPort = srv.getPort(MyClass.class);

我需要的是在第一行之前放置一些代码,这会使客户端每次通过myClassPort调用一些远程方法时都会发送这个“cookie”字符串。 THX。

2 个答案:

答案 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.Objectjavax.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就是其中之一。