How can I access HTTP headers in Spring-ws endpoint?
My code looks like this:
public class MyEndpoint extends AbstractMarshallingPayloadEndpoint {
protected Object invokeInternal(Object arg) throws Exception {
MyReq request = (MyReq) arg;
// need to access some HTTP headers here
return createMyResp();
}
}
invokeInternal()
gets only the unmarshalled JAXB object as the parameter. How can I access HTTP headers that came with the request inside invokeInternal()
?
One way that would probably work is to create a Servlet filter that stores header values to ThreadLocal
variable that is then accessed inside invokeInternal()
, but is there a nicer, more spring-like way to do this?
You can add these methods. The TransportContextHolder
will hold some data related to transport (HTTP in this case) in a thread local variable. You can access HttpServletRequest
from the TransportContext
.
protected HttpServletRequest getHttpServletRequest() {
TransportContext ctx = TransportContextHolder.getTransportContext();
return ( null != ctx ) ? ((HttpServletConnection ) ctx.getConnection()).getHttpServletRequest() : null;
}
protected String getHttpHeaderValue( final String headerName ) {
HttpServletRequest httpServletRequest = getHttpServletRequest();
return ( null != httpServletRequest ) ? httpServletRequest.getHeader( headerName ) : null;
}
You can access to HTTP headers in Spring SOAP Endpoint by injecting HttpServletRequest.
For example, you need to get Autorization header (you use Basic authentication).
SOAP request:
POST http://localhost:8025/ws HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: ""
Authorization: Basic YWRtaW46YWRtaW4=
Content-Length: 287
Host: localhost:8025
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tok="http://abcdef.com/integration/adapter/services/Token">
<soapenv:Header/>
<soapenv:Body>
<tok:GetTokenRequest>
</tok:GetTokenRequest>
</soapenv:Body>
</soapenv:Envelope>
@Endpoint java class
@Endpoint
@Slf4j
public class TokenEndpoint {
public static final String NAMESPACE_URI = "http://abcdef.com/integration/adapter/services/Token";
private static final String AUTH_HEADER = "Authorization";
private final HttpServletRequest servletRequest;
private final TokenService tokenService;
public TokenEndpoint(HttpServletRequest servletRequest, TokenService tokenService) {
this.servletRequest = servletRequest;
this.tokenService = tokenService;
}
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "GetTokenRequest")
@ResponsePayload
public GetTokenResponse getToken(@RequestPayload GetTokenRequest request) {
String auth = servletRequest.getHeader(AUTH_HEADER);
log.debug("Authorization header is {}", auth);
return tokenService.getToken(request);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With