Pregunta

Soy un novato en servicios web. Tengo un servicio JAX-WS para el que necesito implementar un mecanismo de sesión. Los mensajes SOAP se transportan a través de HTTP, utilizamos WebLogic, por lo que la aplicación JAXWS se implementa en WebLogic App Server y se puede acceder a los servicios desde el documento WSDL.

Tengo @WebServiceProvider (clase que implementa el proveedor <AapMessage>)

Ahora, cuando disparo una solicitud de inicio de sesión, quiero que se envíe la cookie de sesión de JSesionID, pero no queremos usar CXF ni cualquier otra cosa, solo llamado Metro, que francamente aún no entiendo por completo. Tampoco queremos hacer de esta una cookie persistente, por lo que agregar manualmente una cookie al encabezado de respuesta tampoco es una opción. Pero eso funciona, lo probé. Simplemente no entiendo por qué Session Cookie no está configurado automáticamente.

He estado buscando en la web y probando muchas cosas durante 4 días, nada funciona. Por favor ayuda.

¿Fue útil?

Solución 2

Encontré la respuesta a mi propia pregunta. El problema estaba en la forma en que se utilizan los enlaces en la implementación de WebServiceProvider. Si se usa el tipo de enlace HTTP, entonces SOAPMessage no se puede usar como tipo para el proveedor. La solución correcta aquí es usar fuente (no estoy seguro de si algo más se puede usar también, no lo intenté), es decir

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;
    }
}

Otros consejos

Por lo general, solo acceder a la httpsession en su servicio web debería ser suficiente para establecer la cookie de sesión en su respuesta.

Puede hacer esto inyectando el WebServiceContext en su servicio web como así, así.

@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");
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top