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

aze*_*rIO 3 soap web-services jax-ws

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

我以下列方式调用服务:

Service srv = Service.create(new URL(WSDL), QNAME);
myClassPort = srv.getPort(MyClass.class);
Run Code Online (Sandbox Code Playgroud)

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

and*_*dih 6

默认情况下,JAX-WSWeb服务和客户端是无状态的.当客户端发出请求时,如果服务器参与会话,则服务器会响应并在连接上设置cookie.但是,JAX-WS客户端忽略该cookie,服务器将后续请求视为新的交互.启用会话后,JAX-WS客户端会为每个后续请求发送相同的cookie,以便服务器可以跟踪客户端会话.

因此,您不应该使用cookie或HTTP会话与Web服务.返回令牌ID作为响应的一部分; 然后客户端可以将其与下一个请求一起发送.

无论如何:

必须使用该javax.xml.ws.session.maintain属性将JAX-WS Web服务客户端配置为维护会话信息(例如cookie).其他Web服务堆栈可能具有类似的机制.

在服务器端

JAX-WS使用Java平台Common Annotations定义的一些方便的注释(JSR 250)来注入Web服务上下文并声明生命周期方法. WebServiceContext保存与正在服务的请求有关的上下文信息.

您不需要实施javax.xml.rpc.server.ServiceLifecycle.使用JAX-WSWeb Service,您需要做的就是使用标记字段或方法@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();

     }
}
Run Code Online (Sandbox Code Playgroud)

  • 在我的建议中,客户端必须明确发送令牌ID.如果您控制所有客户,如果不是这种情况,那么Cookie可能是一种选择,但通常情况下,Cookie不适用于Web服务. (2认同)