Spring生成的WSDL暴露了错误的协议(HTTP与HTTPS)端点位置

时间:2017-02-22 12:26:47

标签: java spring web-services wsdl reverse-proxy

我有一个运行在Apache 2后面的Tomcat服务器(通过mod_proxy),在Tomcat中有一个服务于Spring生成的Web服务的WAR,它公开了这样的服务:

<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实际上是通过以下URL获得的:

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

鉴于出现上述两个问题:

  1. 为什么WSDL将'80'端口添加到端点位置?它可以被覆盖吗?
  2. 为什么它会获得'http'协议,尽管请求的实际URL是通过'https'? Spring不会解释'X-forwarded-for'标题吗?
  3. 类似的问题,但并非完全有用: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>
    

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

您可能需要检查Tomcat配置,您需要在其中设置&#34; proxyName&#34;和&#34; proxyPort&#34;。 JAX-WS自动生成应该从那里/ request-headers中获取它。 更多信息请访问:http://tomcat.apache.org/tomcat-6.0-doc/proxy-howto.html