Как добавить http-прокси для клиента Jersey2

Установить прокси для клиента на Jersey1.x несложно:

config.getProperties().put(ApacheHttpClientConfig.PROPERTY_PROXY_URI, proxyUrl);

Но как добавить http-прокси для клиента Jersey2.x? Я проверил исходный код и не нашел, что реализация делает это в:

org.glassfish.jersey.client.HttpUrlConnector

Спасибо!


person feuyeux    schedule 22.09.2013    source источник


Ответы (6)


спасибо @feuyeux, решение работает для меня, ps, приведенный ниже код работает в прокси-сервере с базовой аутентификацией http:

    ClientConfig config = new ClientConfig();
    config.connectorProvider(new ApacheConnectorProvider());
    config.property(ClientProperties.PROXY_URI, proxy);
    config.property(ClientProperties.PROXY_USERNAME,user);
    config.property(ClientProperties.PROXY_PASSWORD,pass);
    Client client = JerseyClientBuilder.newClient(config);

надеюсь помочь другим

person NGloom    schedule 15.05.2015

Установка другого прокси во время выполнения не является хорошим решением. Соответственно, для этого я использовал коннектор apache:

добавить определенную зависимость коннектора apache:

<dependency>
 <groupId>org.glassfish.jersey.connectors</groupId>
 <artifactId>jersey-apache-connector</artifactId>
</dependency>

добавить коннектор apache к клиенту

config.property(ApacheClientProperties.PROXY_URI, proxyUrl); 
Connector connector = new ApacheConnector(config); 
config.connector(connector); 
person feuyeux    schedule 25.09.2013
comment
Он отлично работает с коннектором apache 2.17, если ClientProperties.PROXY_URI начинается с http:// - person Alix Lourme; 25.10.2018

Если вы используете HTTP-коннектор jersey 2.0 по умолчанию (который является JDK Http (s) URLConnection). Вы можете просто настроить прокси, например:

    System.setProperty ("http.proxyHost", "proxy_server");
    System.setProperty ("http.proxyPort", "proxy_port");

Для других реализаций http-коннектора (HTTP-клиент Apache и асинхронный клиент Grizzly) я раньше не пробовал. Но я думаю, вы могли бы следовать инструкциям самого http-коннектора.

person Lifecube    schedule 24.09.2013
comment
Спасибо за вашу помощь, я думаю, что это должно быть хорошим решением для одной среды, но если мне нужно абстрагировать мой бизнес-клиент, а прокси-сервер является параметром, разве это не работает при каждой настройке времени? Есть проблема с синхронизацией? - person feuyeux; 24.09.2013
comment
вы можете использовать файл свойств для настройки параметров. или вы можете использовать -Dhttp.proxyHost=proxy_server и -Dhttp.proxyPort=proxy_port - person Lifecube; 24.09.2013
comment
Установка другого прокси во время выполнения не является хорошим решением. Соответственно, для этого я использовал коннектор apache: , прокси-адрес); Соединитель коннектора = новый ApacheConnector(config); конфиг.коннектор(коннектор); - person feuyeux; 24.09.2013
comment
Устанавливать разные прокси во время выполнения не очень хорошее решение - почему бы и нет? что, если мне нужно сделать несколько подключений через разные сети? В этом случае установка во время выполнения важна. - person Rick-777; 24.03.2015

Это решение сработало для меня

pom.xml

<dependency>
    <groupId>org.glassfish.jersey.connectors</groupId>
    <artifactId>jersey-apache-connector</artifactId>
    <version>2.17</version>
</dependency>

Ява

ClientConfig config = new ClientConfig();
config.property( ClientProperties.PROXY_URI, "http://_YOUR_URI_:_YOUR_PORT_" );
config.connectorProvider( new ApacheConnectorProvider() );
Client client = ClientBuilder.newClient( config );

Надеюсь, это поможет :)

person Halayem Anis    schedule 29.01.2018
comment
Спасибо, Халаем Анис. Ваш ответ действительно помог мне. - person MaxKing; 20.03.2019

Альтернатива без включения jersey-apache-connector

public class Sample {

  public static void main(String[] args) {

    // you can skip AUTH filter if not required
    ClientConfig config = new ClientConfig(new SampleProxyAuthFilter());
    config.connectorProvider(
        new HttpUrlConnectorProvider().connectionFactory(new SampleConnectionFactory()));

    Client client = ClientBuilder.newClient(config);

    // there you go
  }
}

class SampleConnectionFactory implements HttpUrlConnectorProvider.ConnectionFactory {
  @Override
  public HttpURLConnection getConnection(URL url) throws IOException {
    return (HttpURLConnection) url
        .openConnection(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("host", 8080)));
  }
}

class SampleProxyAuthFilter implements ClientRequestFilter {

  @Override
  public void filter(ClientRequestContext requestContext) throws IOException {
    requestContext.getHeaders().add("Proxy-Authorization", "authentication");
  }
}
person keshin    schedule 26.07.2018
comment
Пока что это единственное решение для добавления прокси, которое работало в коде Джерси 2 — спасибо. - person NerdDad; 30.07.2019
comment
Это работает для использования прокси через TSL/SSL? Я попытался перейти на Proxy.Type.SOCKS, и, похоже, он просто завис. Я не хочу использовать системные свойства, так как мне нужно сделать некоторые другие вызовы через HTTPS, которые не будут использовать прокси. - person mekane84; 13.12.2019
comment
@mekane84 mekane84, Proxy.Type.HTTP означает, что прокси-сервер - http, он отлично работает, когда я захожу с ним на сервер https (TSL / SSL). - person keshin; 07.05.2020

Проблема со стандартной конфигурацией прокси-сервера Джерси 2.x заключается в том, что она не позволяет использовать опцию nonProxyHosts. Он также не позволяет разделять вызовы http и https, но эти ограничения меня устраивали.

Чтобы иметь возможность повторно использовать свойства прокси-сервера JVM (-Dhttp.proxyHost,...) вместо указания выделенных параметров Джерси, вы можете зарегистрировать конкретный соединитель конфигурации Джерси (относительно предыдущих ответов, он мог или не мог быть вне коробка в прошлом, но ее нет в текущей версии майки 2.30):

В maven3 pom.xml:

  <properties>
    <jersey.version>2.30.1</jersey.version>
  </properties>
  <dependency>
    <groupId>org.glassfish.jersey.connectors</groupId>
    <artifactId>jersey-apache-connector</artifactId>
    <version>${jersey.version}</version>
  </dependency>

В вашем коде Джерси:

  • добавить ApacheConnectorProvider
  • зарегистрируйте новый ApacheHttpClientBuilderConfigurator, который установит флаг .useSystemProperties() на базовом клиенте HttpClient
ClientConfig config = new ClientConfig()

    // Apache connector to active the proxy settings
    // EDIT: comment this line as it seems to be useless when using ApacheHttpClientBuilderConfigurator (below) and it provokes random hangs
    //.connectorProvider(new ApacheConnectorProvider())

    // Register specific features and black-magic Jersey behaviors
    //.register(Xxxx.class)
    //.register(Yyyy.class)

    // By registering this magic lambda (Found after debugging both Jersey and HttpClient)
    // We fallback on the regular JVM proxy settings properties, and avoid the restricted
    // jersey properties.
    //
    // Jersey proxy properties are restrictive because they ignore nonProxyHosts.
    // Jersey properties:
    // .property(ClientProperties.PROXY_URI, "http://host:port")
    // .property(ClientProperties.PROXY_USERNAME, "myProxyUser")
    // .property(ClientProperties.PROXY_PASSWORD, "myProxyPassword")
    //
    // To be able to take into account regular JVM proxy properties:
    // For HTTP: -Dhttp.proxyHost=http.proxy.example.com -Dhttp.proxyPort=10080
    // For HTTPS: -Dhttps.proxyHost=https.proxy.example.com -Dhttps.proxyPort=10443
    // Common for BOTH http and https: -Dhttp.nonProxyHosts=foo.example.com|bar.example.com|*baz.example.com
    // Auth NTLM: -Dhttp.proxyUser=MyDomain/username or -Dhttp.auth.ntlm.domain=MyDomain
    // Auth Basic: -Dhttp.proxyUser=username or -Dhttp.proxyPassword=password
    .register(
        ((ApacheHttpClientBuilderConfigurator)
            httpClientBuilder -> {
                  RequestConfig requestConfig =
                      RequestConfig.custom()
                          .setConnectTimeout(5000)
                          .setConnectionRequestTimeout(5000)
                          .setSocketTimeout(5000)
                          .build();
                  httpClientBuilder.setDefaultRequestConfig(requestConfig);
                  httpClientBuilder.useSystemProperties();
              return httpClientBuilder;
            }))

    // Register other properties
    //.property(ClientProperties.CONNECT_TIMEOUT, 5000)
    //.property(ClientProperties.READ_TIMEOUT, 5000)
    //.property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true);
person lounagen    schedule 05.05.2020