4

我是网络服务的新手。我有一个 JAX-WS 服务,我需要为其实现会话机制。SOAP 消息通过 HTTP 传输,我们使用 WebLogic,因此 JAXWS 应用程序部署在 WebLogic 应用服务器上,并且可以从 WSDL 文档访问服务。

我有 @WebServiceProvider(实现 Provider< SOAPMessage > 的类)

现在,当我触发登录请求时,我希望将 JSESSIONID 会话 cookie 发回,但我们不想使用 CXF 或其他任何东西,即所谓的 Metro,坦率地说,我还没有完全理解。我们也不想让它成为一个持久的 cookie,所以手动添加一个 cookie 到响应头中也不是一个选项。但这行得通,我试过了。我只是不明白为什么没有自动设置会话 cookie。

我已经在网上搜索并尝试了 4 天的很多东西,但没有任何效果。请帮忙。

4

2 回答 2

3

通常,只需访问 Web 服务中的 HttpSession 就足以在响应中设置会话 cookie。

您可以通过像这样将 WebServiceContext 注入您的 Web 服务来做到这一点——

@Resource
private WebServiceContext ctx;
public void webServiceMethod() {
     MessageContext mc = ctx.getMessageContext();
     HttpSession session =    ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
     if (session == null)
         throw new WebServiceException("No HTTP Session found");
于 2012-01-13T00:54:49.147 回答
3

我找到了自己问题的答案。问题在于绑定在 WebServiceProvider 实现中的使用方式。如果使用 HTTP 绑定类型,则 SOAPMessage 不能用作 Provider 的类型。这里正确的解决方案是使用Source(不确定是否也可以使用其他东西,没有尝试),即

package com.primavera.ws.jaxws.provider;

import javax.annotation.Resource;
import javax.xml.ws.BindingType;
import javax.xml.ws.Provider;
import javax.xml.ws.Service;
import javax.xml.ws.ServiceMode;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.WebServiceProvider;

@WebServiceProvider(portName="MyPort", serviceName="MyService", targetNamespace="http://mytargetlocation", wsdlLocation="WEB-INF/wsdl/My.wsdl")
@ServiceMode(value = Service.Mode.MESSAGE)
@BindingType(HTTPBinding.HTTP_BINDING)

public class MyProvider implements Provider<Source> {

    @Resource
    private WebServiceContext context;


    public MyProvider()
    {
    }

    @Override
    public Source invoke(Source request)
    {
        MessageContext mc = context.getMessageContext();
        HttpSession session =    ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
        if (session == null)
            throw new WebServiceException("No HTTP Session found");

        System.out.println("SessionID: " + session.getId());

        return request;
    }
}
于 2012-01-23T22:31:21.980 回答