Как получить доступ к заголовкам HTTP в конечной точке Spring-ws? - PullRequest
8 голосов
/ 20 октября 2010

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

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

Ответы [ 3 ]

15 голосов
/ 26 октября 2010

Вы можете добавить эти методы. TransportContextHolder будет содержать некоторые данные, связанные с транспортом (в данном случае 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;
}
0 голосов
/ 22 августа 2018

Вы можете получить доступ к 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>

@ Конечная точка 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);
    }
}
0 голосов
/ 20 октября 2010

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

...