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

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

作者:互联网

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

The server sent HTTP status code 302: Moved Temporarily

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

有没有办法可以配置服务来正确处理这个问题?

我使用wsimport生成了webservice代码并进行调用

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

我被困住了,我无法在任何地方找到解决方案,所以任何帮助都会受到赞赏.

解决方法:

经过大量调查后,我终于找到了问题所在.一切都归结为从http重定向到https.从我在网上找到的文章(不能再记住网址),wsdl2java和wsimport存根生成器用来进行网络服务通信的库是否由于安全原因不允许http到https重定向.

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

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

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来检查这一点.它会说它正在拨打哪个网址.

我没有调查或选择配置wsdl2java和wsimport来生成存根并强制存根使用https调用,这样我就可以为不同的环境配置多个url端点.

标签:java,jax-ws,web-services,soap,load-balancing
来源: https://codeday.me/bug/20191005/1856662.html