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?
- Haben Sie einen Blick auf die
SoapEnvelopeLoggingInterceptor
: docs.Frühling.io/spring-ws/site/apidocs/org/springframework/ws/... - Ich werde versuchen, dass eine zweite-last resort, vielen Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der messageContext Objekt, das Sie abrufen können entweder die Anfrage oder die Antwort (In deinem Fall, ich denke, Sie müssen der Anforderung).
Dem Anfrage - /Antwort-ist im Grunde eine WebServiceMessage. Wenn Sie untersuchen die webServiceMessage, werden Sie sehen, dass das Objekt kann gegossen werden, um eine SoapMessage. Aus der soap-Nachricht, können Sie nun den soap-header.
Danach, möchten Sie vielleicht, um die Quelle Objekt und konvertieren es in ein DOMSource-Objekt und dann die Knoten Objekt, das die Informationen abrufen, die viel einfacher.
Wenn du mit spring-boot-Sie können diese Art der Konfiguration:
In diesem Beispiel die addInterceptors Methode ist das wichtige, die anderen 3 sind grundlegende, dass ein WSDL-API.
Vielleicht ist es für jemand anderen nützlich.
Gibt es keine einfache Möglichkeit, unmarshall von Soap-Headern mit Spring-ws (es ist derzeit nicht unterstützt)
Sie können jedoch den Zugriff auf die SoapHeaderElement im @PayloadRoot annotierten Methode und den Prozess des unmarshalling mit JAXB.
Security.java
UsernameToken.java