Клиент WS с прокси и аутентификацией
Я знаю, что это не совсем правильный способ задать вопрос, но у меня проблема:
У меня локально хранится wsdl, и мне нужно создать клиент веб-службы для вызова этой веб-службы. Проблема в том, что служба находится за брандмауэром, и мне нужно подключиться к нему через прокси-сервер, а после этого мне нужно авторизоваться для подключения к WS.
Что я сделал, это сгенерировал WS Client с Apache CXF 2.4.6, затем установил общесистемный прокси
System.getProperties().put("proxySet", "true");
System.getProperties().put("https.proxyHost", "10.10.10.10");
System.getProperties().put("https.proxyPort", "8080");
Я знаю, что это не лучшая практика, поэтому, пожалуйста, предложите лучшее решение, также, если кто-то может дать мне совет о том, как установить аутентификацию, я действительно ценю это
4 ответа
С apache CXF
HelloService hello = new HelloService();
HelloPortType helloPort = cliente.getHelloPort();
org.apache.cxf.endpoint.Client client = ClientProxy.getClient(helloPort);
HTTPConduit http = (HTTPConduit) client.getConduit();
http.getClient().setProxyServer("proxy");
http.getClient().setProxyServerPort(8080);
http.getProxyAuthorization().setUserName("user proxy");
http.getProxyAuthorization().setPassword("password proxy");
Если вы используете конфигурацию Spring Java, для настройки клиента JAX-WS с Apache CXF (3.xx) будет работать следующий код:
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.transport.http.HTTPConduit;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import de.codecentric.namespace.weatherservice.WeatherService;
@Configuration
public class WeatherServiceConfiguration {
@Bean
public WeatherService weatherService() {
JaxWsProxyFactoryBean jaxWsFactory = new JaxWsProxyFactoryBean();
jaxWsFactory.setServiceClass(WeatherService.class);
jaxWsFactory.setAddress("http://yourserviceurl.com/WeatherSoapService_1.0");
return (WeatherService) jaxWsFactory.create();
}
@Bean
public Client client() {
Client client = ClientProxy.getClient(weatherService());
HTTPConduit http = (HTTPConduit) client.getConduit();
http.getClient().setProxyServer("yourproxy");
http.getClient().setProxyServerPort(8080); // your proxy-port
return client;
}
}
Вот соответствующая конфигурация Spring XML:
Документация: http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:http-conf="http://cxf.apache.org/transports/http/configuration"
xmlns:sec="http://cxf.apache.org/configuration/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd
http://cxf.apache.org/configuration/security http://cxf.apache.org/schemas/configuration/security.xsd">
<http-conf:conduit name="*.http-conduit">
<http-conf:client ProxyServer="proxy" ProxyServerPort="8080"/>
<http-conf:proxyAuthorization>
<sec:UserName>proxy_user</sec:UserName>
<sec:Password>proxy_pass</sec:Password>
</http-conf:proxyAuthorization>
</http-conf:conduit>
Чтобы это работало, вы должны импортировать cxf.xml:
<import resource="classpath:META-INF/cxf/cxf.xml"/>
Обратите внимание, что этот httpConduit будет включен для всех ваших клиентов CXF (если их несколько).
Вы должны настроить имя вашего канала, чтобы оно соответствовало только вашему сервисному каналу:
name="{http://example.com/}HelloWorldServicePort.http-conduit"
Вы также можете установить имя пользователя и пароль для прокси с помощью класса java.net.Authenticator, но я не уверен, что это не "общесистемный" параметр.
Посмотрите здесь: HTTP-прокси с аутентификацией