小编典典

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

java

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

服务器发送了HTTP状态代码302:临时移动

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

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

我使用生成了Web服务代码,wsimport并因此进行了调用

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

我陷入困境,无法在任何地方找到解决方案,因此将不胜感激。


阅读 220

收藏
2020-11-13

共1个答案

小编典典

因此,经过大量调查,我终于弄清了问题所在。一切都归结于从http重定向到https。从我在网上找到的文章(不再记得网址) 来看 ,由于安全原因,
wsdl2javawsimport 存根生成器用来进行Web服务通信的库不允许使用HTTP到https重定向。

因此,即使我从https
wsdl位置即生成了存根。https://wsdl.location.com?wsdl,当我运行代码进行网络服务调用时,它正试图调用http://wsdl.location.com,从而导致对https:/的重定向请求/wsdl.location.com,但是http库不允许这样做。因此,它只是将302
http代码转发为异常。

另外,有两个Web服务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
来生成存根并强制存根使用https调用,因此我可以为不同的环境配置多个URL端点。

2020-11-13