Клиент WS с прокси и аутентификацией

Я знаю, что это не совсем правильный путь, чтобы задать вопрос, но у меня проблема:

У меня есть WSDL, хранящийся локально, и мне нужно создать клиент веб-службы для вызова этой веб-службы. Проблема в том, что служба находится за брандмауэром, и я должен подключиться к ней через прокси-сервер, и после этого я должен аутентифицироваться для подключения к WS.

то, что я сделал, это создать клиент WS с 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");

Я знаю, что это не лучшая практика, поэтому, пожалуйста, предложите лучшее решение, также, если кто - нибудь может дать мне совет о том, как установить аутентификацию i'DD действительно ценю это

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.X. x), следующий код будет работать:

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.сеть.Класс Authenticator, но я не уверен, что это не" общесистемная " настройка.

посмотреть здесь: аутентифицированный HTTP-прокси с Java