7

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

У меня есть WSDL хранится локально, и мне нужно создать веб Service Client для вызова этого веб-сервиса. Проблема заключается в том, что служба находится за брандмауэром, и я должен подключиться к ней через прокси-сервер, и после этого я должен аутентифицироваться для подключения к 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 действительно ценю это

ответ

16

с 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"); 
+0

Большое спасибо. Действительно полезный совет –

0

Вы также можете установить прокси-имя пользователя и пароль, используя java.net.Authent класс icator, но я не уверен, что он не является «системным».

Посмотрите здесь: Authenticated HTTP proxy with Java

4

Вот соответствующая конфигурация 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 (если несколько).

Вы должны настроить имя трубопровода, чтобы соответствовать только вашей Conduit службы:

name="{http://example.com/}HelloWorldServicePort.http-conduit" 
+1

proxy host = 'ProxyServer' свойство, port =' ProxyServerPort' свойство, кажется, что я не понимаю ваш вопрос – yunandtidus

4

Если you're с использованием конфигурации 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; 
    } 
} 
+0

он тоже работает для меня! Спасибо! – ncowboy