Соединение с прокси-сервером приложения Java отклонено - PullRequest
0 голосов
/ 19 декабря 2018

Я боролся с этой проблемой последние полтора дня и, наконец, сломался после того, как мои поиски не дали ничего, что могло бы решить мою проблему.

У меня есть приложение Spring-boot, которое выполняет вызовы SOAP на удаленный сервер.Все отлично работает с STS или с локальным запуском на моем ноутбуке для разработки (либо с помощью STS> Run, mvn spring-boot: run, либо с помощью запуска файла JAR локально. Когда я развертываю код (толстый jar) на нашем сервере разработки corpвсе мои запросы терпят неудачу с «Отказано в соединении (Соединение отказано)».

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

ЗАПРОС БАРЫ:

curl http://some.remote.server

-> curl: (7) Не удалось подключиться к: 80; соединение отклонено

Запрос с настройками прокси / AUTH:

export http_proxy=http://<proxy_user>:<proxy_pass>@<proxy_host>:<proxy_port>
curl -x $http_proxy http://some.remote.server

->Удачи!

Итак, на данный момент я почти уверен, что проблема, с которой я сталкиваюсь, заключается в том, что мои вызовы не перенаправляются через прокси.

Я пытался добавитьнастройки прокси для кода, но мне не нравится идея уменьшения переносимости (кроме того, это не сработало).

Я попытался установить параметры в командной строке с помощью:

java -Dhttp.proxyHost=<corp proxy host addr> -Dhttp.proxyPort=3128 -Dhttp.proxyUser=<proxy username> -Dhttp.proxyPassword=<proxy pass> -jar Application.jar

Ничто из того, что я делаю, не делает ничего особенногоce.

Какие еще инструменты / методы я могу использовать для диагностики / устранения этой проблемы?У меня не хватает волос, чтобы вытащить!

[примечание: в конечном итоге это будет выполняться из контейнера Docker, но я удалил как можно больше движущихся частей, чтобы упростить решение.Я думаю, что я делаю что-то очень простое неправильно, потому что я уверен, что это не уникальная проблема.]

public String makeTestRequest()
{
    try
    {
        final String authUser = PROXY_USER;
        final String authPassword = PROXY_PASS;
        Authenticator.setDefault(
           new Authenticator() {
              @Override
              public PasswordAuthentication getPasswordAuthentication() {
                 return new PasswordAuthentication(
                       authUser, authPassword.toCharArray());
              }
           }
        );

        System.setProperty("http.proxyUser", PROXY_USER);
        System.setProperty("http.proxyPassword", PROXY_PASS);
        System.setProperty("http.proxyHost", PROXY_HOST);
        System.setProperty("http.proxyPort", String.valueOf(PROXY_PORT));


        URL url = new URL(REMOTE_URL);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        System.out.println("Proxy? " + con.usingProxy());   // proxy?
        con.setRequestMethod("GET");

        int status = con.getResponseCode();
        if (status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_MOVED_PERM) 
        {
            String location = con.getHeaderField("Location");
            URL newUrl = new URL(location);
            con = (HttpURLConnection) newUrl.openConnection();
        }

        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer content = new StringBuffer();
        while ((inputLine = in.readLine()) != null) 
        {
            content.append(inputLine);
        }

        // cleanup / return
        in.close();
        con.disconnect();
        return content.toString();
    }
    catch (Exception e)
    {
        e.printStackTrace();
        return e.getMessage();
    }
}

1 Ответ

0 голосов
/ 21 декабря 2018

Для всех, кто сталкивался с этой проблемой и борется, вот код, который работал для меня:

package proxycheck;


import java.io.IOException;
import java.io.InputStream;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;



public class ConnectionTest 
{
    private static final String PROXY_HOST_URI = "mycompanyproxy.corp.net";
    private static final int    PROXY_PORT = 7283;
    private static final String TEST_URL   = "http://some.remote.service.com/something";

    public static void main(String[] args) 
    throws IOException 
    {
        Authenticator.setDefault(new EdlsAuthenticator());
        HttpURLConnection conn;
        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_HOST_URI, PROXY_PORT));

        URL httpUrl = new URL(TEST_URL);
        conn = (HttpURLConnection) httpUrl.openConnection(proxy);

        System.out.println(conn.getResponseCode());
        System.out.println(readResponse((InputStream) conn.getContent()));
    }


    public static String readResponse (InputStream in) 
    throws IOException 
    {
        StringBuffer out = new StringBuffer();
        byte[] b = new byte[4096];
        for (int n; (n = in.read(b)) != -1;) 
        {
            out.append(new String(b, 0, n));
        }
        return out.toString();
    }

}




class EdlsAuthenticator extends Authenticator 
{
    protected PasswordAuthentication getPasswordAuthentication() 
    {       
        String username = "ProxyUsername";
        String password = "ProxyPassword";
        return new PasswordAuthentication(username, password.toCharArray());
    }
}

Мой pom.xml содержит следующие зависимости:

<dependency>
    <groupId>commons-httpclient</groupId>
    <artifactId>commons-httpclient</artifactId>
    <version>3.1</version>
</dependency>
<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.1</version>
</dependency>
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.9</version>
</dependency>
<dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>3.1.0</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.5</version>
</dependency>
<dependency>
    <groupId>org.apache.httpcomponents</groupId>
    <artifactId>httpcore</artifactId>
    <version>4.3.2</version>
</dependency>
<dependency>
    <groupId>org.soulwing.ssl</groupId>
    <artifactId>ssl-context-tools</artifactId>
    <version>1.0.1</version>
</dependency>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...