gpt4 book ai didi

java - 使用 jax-ws 调用位于负载均衡器上的 Web 服务返回 302 的 http 状态,但是当我使用 SoapUI 时它工作正常

转载 作者:行者123 更新时间:2023-11-29 09:39:37 25 4
gpt4 key购买 nike

当我使用 jax-ws 调用位于负载均衡器上的 Web 服务时,它返回

The server sent HTTP status code 302: Moved Temporarily

然后失败,但是当我使用 SoapUI 时它工作正常。

有没有一种方法可以配置服务以正确处理此问题?

我使用 wsimport 生成了 web 服务代码并进行调用

NotificationWebService service = new NotificationWebService(wsdlLocation, qName);
NotificationWebServiceSoap serviceSoap = service.getNotificationWebServiceSoap();
String xmlString = serviceSoap.getRSAPublicKeyXMLString();

我被困住了,我无法在任何地方找到解决方案,因此我们将不胜感激。

最佳答案

经过大量调查,我终于弄清楚问题出在哪里。这一切都归结为从 http 重定向到 https。从我在网上找到的文章(不再记得网址)来看,wsdl2javawsimport stub 生成器用来进行 web 服务通信的库是不是出于安全原因,不允许从 http 到 https 重定向。

所以即使我是从 https wsdl 位置生成 stub ,即。 https://wsdl.location.com?wsdl ,当我运行代码进行网络服务调用时,它试图调用 http://wsdl.location.com这导致重定向请求到 https://wsdl.location.com ,但是http库不允许这样。所以它只是将 302 http 代码作为异常向上转发。

此外,还有两个网络服务 URL。一个是测试服务,它是普通的 http url,然后是一个通过 https 的生产服务器。因此,要解决这个问题,我所做的就是使用 BindingProvider 类动态配置服务以使用我指定的端点(现在是 https 地址)。这也允许我根据正在调用的环境动态指定使用测试 url 或生产 url。

NotificationWebService service = new NotificationWebService();
NotificationWebServiceSoap serviceSoap = service.getNotificationWebServiceSoap();

BindingProvider bindingProvider = (BindingProvider) serviceSoap;
bindingProvider.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://wsdl.location.com");

String xmlString = serviceSoap.getRSAPublicKeyXMLString();

简而言之,如果有人遇到这个问题。确保您需要指向的终点是否在 https 上,您是在进行直接 https 调用,而不是请求 https 重定向的 http 调用。您可以在调试时通过检查 serviceSoap 来检查这一点。它会说明正在调用哪个 url。

我没有研究或选择配置 wsdl2javawsimport 来生成 stub 并强制 stub 使用 https 调用,这样我就可以为不同的环境配置多个 url 端点。

关于java - 使用 jax-ws 调用位于负载均衡器上的 Web 服务返回 302 的 http 状态,但是当我使用 SoapUI 时它工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13702022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com