Frage

Ich bin ein Neuling in Webdiensten. Ich habe einen JAX-WS-Service, für den ich den Sitzungsmechanismus implementieren muss. Die SOAP -Nachrichten werden über HTTP transportiert, wir verwenden WebLogic, sodass die JAXWS -Anwendung auf dem Weblogic App Server bereitgestellt wird und die Dienste über das WSDL -Dokument zugänglich sind.

Ich habe @WebserviceProvider (Klasse, die Anbieter <soapmessage> implementiert)

Wenn ich nun eine Anmeldeanfrage abfasse, möchte ich, dass JSESSIONID -Session -Cookie zurückgesandt wird, aber wir möchten nicht CXF oder irgendetwas anderes verwenden, nur so genannte Metro, was ich ehrlich gesagt noch nicht vollständig verstehe. Wir möchten dies auch nicht zu einem anhaltenden Keks machen, daher ist auch keine Option, ein Cookie zum Antwortheader manuell hinzuzufügen. Aber das funktioniert, ich habe es versucht. Ich verstehe einfach nicht, warum Session Cookie nicht automatisch eingerichtet ist.

Ich habe das Internet gesucht und seit 4 Tagen viele Dinge ausprobiert, nichts funktioniert. Bitte helfen Sie.

War es hilfreich?

Lösung 2

Ich fand die Antwort auf meine eigene Frage. Das Problem war in der Art und Weise, wie die Bindungen bei der Implementierung von WebServiceProvider verwendet werden. Wenn der HTTP -Bindungstyp verwendet wird, kann SOAPMESSAGE nicht als Typ für den Anbieter verwendet werden. Die richtige Lösung hier ist die Verwendung von Quelle (nicht sicher, ob auch etwas anderes verwendet werden kann, nicht versucht), dh, dh

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

Andere Tipps

In der Regel sollte der Zugriff auf die HTTPSession in Ihrem Webdienst ausreichen, um das Sitzungs -Cookie in Ihrer Antwort festzulegen.

Sie können dies tun, indem Sie den WebServiceContext in Ihren Webdienst wie so -injizieren -injizieren -

@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");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top