Как я устанавливаю прокси, который будет использоваться JVM

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
291
задан Hearen 22 March 2019 в 23:12
поделиться

7 ответов

Из документации Java ( не javadoc API):

http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html

Набор флаги JVM http.proxyHost и http.proxyPort при запуске JVM на командной строке. Это обычно делается в сценарии оболочки (в Unix) или bat-файл (в Windows). Вот пример со сценарием оболочки Unix:

JAVA_FLAGS=-Dhttp.proxyHost=10.0.0.100 -Dhttp.proxyPort=8800
java ${JAVA_FLAGS} ...

При использовании контейнеров, таких как JBoss или WebLogic, мое решение состоит в том, чтобы отредактировать сценарии запуска, предоставленные поставщиком.

Многие разработчики знакомы с API Java (javadocs), но много раз остальная часть документации пропущена. Это содержит большую интересную информацию: http://download.oracle.com/javase/6/docs/technotes/guides/

<час>

Обновление: , Если Вы не хотите использовать прокси для разрешения некоторых локальных хостов / хостов интранет, проверьте комментарий от @Tomalak:

Также не забывают http.nonProxyHosts свойства!

-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com‌​|etc"
333
ответ дан javabrett 23 November 2019 в 01:41
поделиться

Для установки HTTP/HTTPS и/или SOCKS проксируют программно:

...

public void setProxy() {
    if (isUseHTTPProxy()) {
        // HTTP/HTTPS Proxy
        System.setProperty("http.proxyHost", getHTTPHost());
        System.setProperty("http.proxyPort", getHTTPPort());
        System.setProperty("https.proxyHost", getHTTPHost());
        System.setProperty("https.proxyPort", getHTTPPort());
        if (isUseHTTPAuth()) {
            String encoded = new String(Base64.encodeBase64((getHTTPUsername() + ":" + getHTTPPassword()).getBytes()));
            con.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
            Authenticator.setDefault(new ProxyAuth(getHTTPUsername(), getHTTPPassword()));
        }
    }
    if (isUseSOCKSProxy()) {
        // SOCKS Proxy
        System.setProperty("socksProxyHost", getSOCKSHost());
        System.setProperty("socksProxyPort", getSOCKSPort());
        if (isUseSOCKSAuth()) {
            System.setProperty("java.net.socks.username", getSOCKSUsername());
            System.setProperty("java.net.socks.password", getSOCKSPassword());
            Authenticator.setDefault(new ProxyAuth(getSOCKSUsername(), getSOCKSPassword()));
        }
    }
}

...

public class ProxyAuth extends Authenticator {
    private PasswordAuthentication auth;

    private ProxyAuth(String user, String password) {
        auth = new PasswordAuthentication(user, password == null ? new char[]{} : password.toCharArray());
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return auth;
    }
}

...

Помнят, что Прокси HTTP и прокси SOCKS работают на разных уровнях в сетевом стеке, таким образом, можно использовать один или другой или оба.

78
ответ дан Chris Carruthers 23 November 2019 в 01:41
поделиться

чтение XML-файла и потребностей загрузить его схему

, Если Вы рассчитываете на получение схем или ДАТ по Интернету, Вы создаете медленное, болтливое, хрупкое приложение. Что происходит, когда тот удаленный сервер, размещающий файл, занимает запланированное или незапланированное время простоя? Ваши повреждения приложения. Что в порядке?

Видят http://xml.apache.org/commons/components/resolver/resolver-article.html#s.catalog.files

, URL для схем и т.п. лучше всего считается уникальными идентификаторами. Не как запросы к на самом деле доступу тот файл удаленно. Сделайте некоторый Google, ищущий на "каталоге XML". Каталог XML позволяет Вам размещать такие ресурсы локально, разрешая замедление, болтливость и хрупкость.

Это - в основном постоянно кэшируемая копия удаленного содержания. И это в порядке, так как удаленное содержание никогда не будет изменяться. Если бы существует когда-нибудь обновление, это было бы в различном URL. Создание фактического извлечения ресурса по особенно глупому Интернету.

8
ответ дан John M 23 November 2019 в 01:41
поделиться

Можно установить некоторые свойства о прокси-сервере как jvm параметры

-Dhttp.proxyPort=8080, proxyHost, и т.д.

, но если Вы должны пройти через прокси аутентификации, Вам нужен аутентификатор как этот пример:

ProxyAuthenticator.java

import java.net.*;
import java.io.*;

public class ProxyAuthenticator extends Authenticator {

    private String userName, password;

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, password.toCharArray());
    }

    public ProxyAuthenticator(String userName, String password) {
        this.userName = userName;
        this.password = password;
    }
}

Example.java

    import java.net.Authenticator;
    import ProxyAuthenticator;

public class Example {

    public static void main(String[] args) {
        String username = System.getProperty("proxy.authentication.username");
        String password = System.getProperty("proxy.authentication.password");

                if (username != null && !username.equals("")) {
            Authenticator.setDefault(new ProxyAuthenticator(username, password));
        }

                // here your JVM will be authenticated

    }
}

На основе этого ответа: http://mail-archives.apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox / % 3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E

12
ответ дан Alex. S. 23 November 2019 в 01:41
поделиться

Можно установить те флаги программно этот путь:

if (needsProxy()) {
    System.setProperty("http.proxyHost",getProxyHost());
    System.setProperty("http.proxyPort",getProxyPort());
} else {
    System.setProperty("http.proxyHost","");
    System.setProperty("http.proxyPort","");
}

Просто возвращают правильные значения из методов needsProxy(), getProxyHost() и getProxyPort(), и можно назвать этот фрагмент кода каждый раз, когда Вы хотите.

47
ответ дан Alok Nair 23 November 2019 в 01:41
поделиться

Вы можете использовать переменные http.proxy * JVM, если вы находитесь в автономной JVM, но НЕ ДОЛЖНЫ изменять их сценарии запуска и / или делать это на своем сервере приложений (кроме, возможно, jboss или tomcat). Вместо этого вам следует использовать JAVA Proxy API (не System.setProperty) или использовать собственные параметры конфигурации поставщика. И у WebSphere, и у WebLogic есть очень определенные способы настройки прокси, которые намного мощнее, чем у J2SE. Кроме того, для WebSphere и WebLogic вы, вероятно, немного сломаете свой сервер приложений, переопределив сценарии запуска (особенно процессы взаимодействия сервера, поскольку вы могли бы сказать им также использовать ваш прокси ...).

-1
ответ дан 23 November 2019 в 01:41
поделиться

Недавно я обнаружил способ разрешить JVM использовать настройки прокси браузера. Для этого нужно добавить ${java.home}/lib/deploy.jar в проект и инициализировать библиотеку следующим образом:

import com.sun.deploy.net.proxy.DeployProxySelector;
import com.sun.deploy.services.PlatformType;
import com.sun.deploy.services.ServiceManager;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public abstract class ExtendedProxyManager {

    private static final Log logger = LogFactory.getLog(ExtendedProxyManager.class);

    /**
     * After calling this method, proxy settings can be magically retrieved from default browser settings.
     */
    public static boolean init() {
        logger.debug("Init started");

        // Initialization code was taken from com.sun.deploy.ClientContainer:
        ServiceManager
                .setService(System.getProperty("os.name").toLowerCase().indexOf("windows") != -1 ? PlatformType.STANDALONE_TIGER_WIN32
                        : PlatformType.STANDALONE_TIGER_UNIX);

        try {
            // This will call ProxySelector.setDefault():
            DeployProxySelector.reset();
        } catch (Throwable throwable) {
            logger.error("Unable to initialize extended dynamic browser proxy settings support.", throwable);

            return false;
        }

        return true;
    }
}

После этого настройки прокси будут доступны Java API через java.net.ProxySelector.

Единственная проблема с этим подходом заключается в том, что вам нужно запустить JVM с deploy.jar в bootclasspath, например java -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar. Если кто-то знает, как преодолеть это ограничение, дайте мне знать.

3
ответ дан 23 November 2019 в 01:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: