当我使用jax-ws调用位于负载均衡器上的Web服务时,它将返回
服务器发送了HTTP状态代码302:临时移动
然后失败,但是当我使用SoapUI时,它工作正常。
有没有一种方法可以配置服务以正确处理此问题?
我使用生成了Web服务代码,wsimport并因此进行了调用
wsimport
NotificationWebService service = new NotificationWebService(wsdlLocation, qName); NotificationWebServiceSoap serviceSoap = service.getNotificationWebServiceSoap(); String xmlString = serviceSoap.getRSAPublicKeyXMLString();
我陷入困境,无法在任何地方找到解决方案,因此将不胜感激。
因此,经过大量调查,我终于弄清了问题所在。一切都归结于从http重定向到https。从我在网上找到的文章(不再记得网址) 来看 ,由于安全原因, wsdl2java 和 wsimport 存根生成器用来进行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。
我没有考虑或不选择配置 wsdl2java 和 wsimport 来生成存根并强制存根使用https调用,因此我可以为不同的环境配置多个URL端点。