How to access HTTP headers in Spring-ws endpoint?

后端 未结 3 611
余生分开走
余生分开走 2021-01-04 18:49

How can I access HTTP headers in Spring-ws endpoint?

My code looks like this:

public class MyEndpoint extends AbstractMarshallingPayloadEndpoint {
           


        
相关标签:
3条回答
  • 2021-01-04 19:35

    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;
    }
    
    0 讨论(0)
  • 2021-01-04 19:36

    I had the same kind of problem (see this other question). I needed to add a Content-Type header to my WS. I went the road of the Servlet Filter. Most of the time, you should not need to change HTTP headers in a webservice. But ... there is sometime a diference between theory and practice.

    0 讨论(0)
  • 2021-01-04 19:54

    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);
        }
    }
    
    0 讨论(0)
提交回复
热议问题