I believe you have already solved this issue, but for the reference of others, you can implement an interceptor to intercept the soap request and can access Soap Headers from there.
Configuration
Code:
<bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping">
<property name="interceptors">
<list>
<ref bean="soapHeaderInterceptor" />
</list>
</property>
</bean>
<bean id="soapHeaderInterceptor" class="sample.HeaderItemInceptionInterceptor" />
Here HeaderItemInceptionInterceptor has implemented EndpointInterceptor
interface. You can override its handle request method to access Soap Header.
Code:
public boolean handleRequest(MessageContext messageContext, Object endpoint)
throws Exception {
System.out.println("Intercepted");
SoapHeader header = ((SoapMessage)messageContext.getRequest()).getSoapHeader();
Iterator i = header.examineAllHeaderElements();
for (Iterator iterator = header.examineAllHeaderElements(); iterator.hasNext();) {
SoapHeaderElement headerElement = (SoapHeaderElement) iterator.next();
if(headerElement.getName().getLocalPart().equals("SessionId")){
String sessionId = headerElement.getText();
// You can take any decission here based on session id. You can generate soap fault here if session is not valid by throwing an exception.
}
}
return true;
}
I hope it will help.
Cheers
Muein