Как получить доступ к заголовкам HTTP в конечной точке Spring-ws?

Как я могу получить доступ к заголовкам HTTP в конечной точке Spring-ws?

Мой код выглядит так:

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() получает в качестве параметра только немаршалированный объект JAXB. Как я могу получить доступ к заголовкам HTTP, которые пришли с запросом внутри invokeInternal()?

Один из способов, который, вероятно, сработает, - это создать фильтр сервлета, который хранит значения заголовков в переменной ThreadLocal, к которой затем обращаются внутри invokeInternal(), но есть ли более приятный, более похожий на пружину способ сделать это?


person Juha Syrjälä    schedule 20.10.2010    source источник


Ответы (3)


Вы можете добавить эти методы. _1 _ будет содержать некоторые данные, относящиеся к транспорту (в данном случае HTTP) в локальной переменной потока. Вы можете получить доступ к HttpServletRequest из 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;
}
person Juha Syrjälä    schedule 26.10.2010

Вы можете получить доступ к заголовкам HTTP в Spring SOAP Endpoint, введя HttpServletRequest.

Например, вам нужно получить заголовок Autorization (вы используете обычную аутентификацию).

Запрос SOAP:

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

@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);
    }
}
person Vladimir    schedule 22.08.2018

У меня была такая же проблема (см. Этот другой вопрос). Мне нужно было добавить заголовок Content-Type к моему WS. Я пошел по пути Servlet Filter. В большинстве случаев вам не нужно изменять заголовки HTTP в веб-сервисе. Но ... между теорией и практикой иногда есть разница.

person Guillaume    schedule 20.10.2010