2017-02-22 65 views
0

У меня есть сервер Tomcat, работающий «позади» Apache 2 (через mod_proxy), в Tomcat есть служба WAR, генерирующая Spring, с помощью веб-служб, которые предоставляют такую ​​услугу, как это одна:Spring Generated WSDL предоставляет неверный протокол (HTTP vs HTTPS). Конечная точка

<wsdl:service name="EcoboxPortService"> 
    <wsdl:port binding="tns:EcoboxPortSoap11" name="EcoboxPortSoap11"> 
     <soap:address location="http://host:80/ecobox-ws/Ecobox"/> 
    </wsdl:port> 
</wsdl:service> 

проблема заключается в том, что WSDL фактически получают по следующему адресу:

https://host/ecobox-ws/ecobox.wsdl (Please note it uses HTTPS) 

Учитывая выше 2 вопроса возникают:

  1. Почему WSDL добавляет порт «80» в местоположение конечной точки? Может ли это быть отменено?
  2. Почему он получает протокол «http», несмотря на то, что фактический URL-адрес был запрошен через «https»? Не Spring интерпретирует заголовки «X-forwarded-for»?

Аналогичный вопрос, но не совсем полезные: change the soap:address location in generated wsdl

Соответствующие зависимости:

<dependency> 
     <groupId>org.springframework.ws</groupId> 
     <artifactId>spring-ws-core</artifactId> 
     <version>2.2.2.RELEASE</version> 
    </dependency> 

Соответствующие web.xml выдержка:

<servlet> 
    <servlet-name>spring-ws</servlet-name> 
    <servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>transformWsdlLocations</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
+0

Включен ли ваш сервер (tomcat и или Apache) для обслуживания ресурсов в HTTP? Мне кажется, что-то более похожее на tomcat. Может ли ваше веб-приложение обслуживать ресурсы в HTTP? –

+0

@AngeloImmediata yes, на самом деле Tomcat настроен только для HTTP, но Apache для обоих – gvasquez

+0

Когда вы пытаетесь отобразить WSDL, набрав URL-адрес http: // ..... вы проверяли, переадресовываете ли вы в https? Если это так ... это связано с конфигурацией Apache. Еще одна проверка, которую вы можете сделать, - это получить доступ к WSDL напрямую (возможно, wget на сервере). –

ответ

1

Возможно, вам захочется проверить конфигурацию Tomcat, где вам необходимо установить «proxyName» и «proxyPort». Автоматическое поколение JAX-WS должно забрать его оттуда/заголовки запроса. Дополнительная информация здесь: http://tomcat.apache.org/tomcat-6.0-doc/proxy-howto.html

+0

Мне нравится этот подход, я посмотрю, что я получу, изменив эти значения, но на первый взгляд я вижу, что я могу помочь Tomcat открыть порт 443 вместо 80, но как насчет протокола? Он все равно будет сообщать http вместо https, я прав? – gvasquez

+0

просто пропустил атрибут «schema», занесенный в «https», с proxyPort в 443, и это сделало трюк ... отличный ответ! – gvasquez

+0

Всегда рад помочь, имел аналогичную проблему, используя nginx w/spring-boot не так давно :) – bigZee77

2

Взгляните here

Вы должны сказать MessageDispatherServlet преобразовать местоположение:

<servlet> 
<servlet-name>spring-ws</servlet-name> 
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class> 
<init-param> 
    <param-name>transformWsdlLocations</param-name> 
    <param-value>true</param-value> 
</init-param> 
</servlet> 

Или, если вы используете Java Config

Если вы используете AbstractAnnotationConfigMessageDispatcherServletInitializer, что позволяет преобразование так просто, как переопределение isTransformWsdlLocations () для возврата true.

+0

Он уже настроен таким образом, по крайней мере, он сохраняет «внешнее» имя хоста, но не протокол и порт. – gvasquez