我是网络服务的新手。我有一个JAX-WS服务,我需要为其实现会话机制。 SOAP消息通过HTTP传输,我们使用WebLogic,因此JAXWS应用程序部署在WebLogic应用服务器上,并且可以从WSDL文档访问服务。
我有@WebServiceProvider(实现Provider< SOAPMessage>的类)
现在,当我发出登录请求时,我希望将JSESSIONID会话cookie发回,但我们不想使用CXF或其他任何东西,就是所谓的Metro,坦率地说我还不完全理解。我们也不希望将其作为持久性cookie,因此手动将cookie添加到响应头也不是一种选择。但是这很有效,我试过了。我只是不明白为什么会话cookie没有自动设置。
我一直在网上搜索并尝试了4天,但没有任何效果。请帮忙。
答案 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;
}
}