Um Inhalte einer SOAP-Header mit Spring WS

Ich versuche zu bauen, die auf einem Endpunkt empfangen werden SOAP-Nachrichten von einem client. Die Botschaft, die ich empfangen enthält einen Benutzernamen und ein Passwort in den soap-header ...

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://www.company.com/Application">
    <soapenv:Header  xmlns:wsse="http://__________.xsd">
        <wsse:Security >
            <wsse:UsernameToken>
                <wsse:Username>username</wsse:Username>
                <wsse:Password>password</wsse:Password>
            </wsse:UsernameToken>
        </wsse:Security>

   </soapenv:Header>
   <soapenv:Body>

Ich bin mit Spring WS - die offensichtliche Lösung ist, erstellen Sie einen filter im inneren web.xml dass umgehen Frühjahr WS komplett, das Parsen der SOAP-Nachricht extrahiert den Benutzernamen und das Passwort und dann weiter auf den Frühling WS, die zum Parsen der SOAP wieder.

Ist es ein Weg, um die Inhalte der Kopf-ohne Umgehung Frühjahr WS?

Ich habe versucht, indem ein bean im inneren sws:interceptors:

<sws:interceptors>

    <!-- extract Security details from Header -->
    <bean class="com.company.application.service.SecurityInterceptorService" />

    <!-- log full Body of request -->
    <bean class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor"/>

    <!-- validate Request against XSD to make sure it's a valid request -->
    <bean id="CompanyApplication" class="com.company.application.interceptor.ValidatingInterceptor">
        <property name="schema" value="/WEB-INF/_______________.xsd" />
        <property name="validateRequest" value="true" />
        <property name="validateResponse" value="true" />
    </bean>

</sws:interceptors>

und dann die Implementierung dieser Klasse:

public class SecurityInterceptorService implements EndpointInterceptor {


    @Override
    public boolean handleRequest(MessageContext messageContext, Object endpoint) throws Exception {

        System.out.println("---------------");
        System.out.println("handleRequest")                                             ;
        System.out.println("---------------");


        return true;
    }

    @Override
    public boolean handleResponse(MessageContext messageContext, Object endpoint) throws Exception {

        System.out.println("---------------");
        System.out.println("handleResponse");
        System.out.println("---------------");



        return true;
    }

    @Override
    public boolean handleFault(MessageContext messageContext, Object endpoint) throws Exception {

        System.out.println("---------------");
        System.out.println("handleFault");
        System.out.println("---------------");


        return true;
    }

    @Override
    public void afterCompletion(MessageContext messageContext, Object endpoint, Exception ex) throws Exception {

        System.out.println("---------------");
        System.out.println("afterCompletion");
        System.out.println("---------------");

    }



}

endpoint enthält nur Daten über den Endpunkt im inneren handleRequest und nach der Durchquerung durch viele Ebenen und Schichten innerhalb messageContext während im debug-Modus, ich kann nicht scheinen zu erkennen, den Inhalt von der header.

Ist der Inhalt, ich bin auf der Suche nach innen messageContext und wenn ja, wie greife ich darauf zu?

Schreibe einen Kommentar