如何使用JSESSIONID(会话ID)使JAX-WS Web服务响应

时间:2012-01-13 00:46:32

标签: java soap weblogic jax-ws jsessionid

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

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

现在,当我发出登录请求时,我希望将JSESSIONID会话cookie发回,但我们不想使用CXF或其他任何东西,就是所谓的Metro,坦率地说我还不完全理解。我们也不希望将其作为持久性cookie,因此手动将cookie添加到响应头也不是一种选择。但是这很有效,我试过了。我只是不明白为什么会话cookie没有自动设置。

我一直在网上搜索并尝试了4天,但没有任何效果。请帮忙。

2 个答案:

答案 0 :(得分: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");

答案 1 :(得分: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;
    }
}