Pergunta

Muitas vezes, um aplicativo Java precisa para se conectar à Internet. O exemplo mais comum acontece quando ele está lendo um arquivo e as necessidades de XML para transferir seu esquema.

Estou atrás de um servidor proxy. Como posso definir o meu JVM para usar o proxy?

Foi útil?

Solução

A partir da documentação Java ( não o javadoc API):

http://download.oracle.com/ JavaSE / 6 / docs / technotes / guias / net / proxies.html

Defina a JVM bandeiras http.proxyHost e http.proxyPort quando iniciar o seu JVM na linha de comando. Isso geralmente é feito em um script shell (no Unix) ou arquivo bat (no Windows). Aqui está o exemplo com o shell script de Unix:

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

Ao usar recipientes, como JBoss ou WebLogic, minha solução é editar os scripts de inicialização fornecidos pelo fornecedor.

Muitos desenvolvedores estão familiarizados com a API Java (javadocs), mas muitas vezes o resto da documentação é esquecido. Ele contém uma grande quantidade de informação interessante: http://download.oracle.com/ JavaSE / 6 / docs / technotes / guias /


Update: Se você não quiser usar o proxy para resolver alguns hospedeiros / intranet local, veja o comentário de @Tomalak:

Também não se esqueça a propriedade http.nonProxyHosts!

-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com‌​|etc"

Outras dicas

Para usar a configuração de proxy do sistema:

java -Djava.net.useSystemProxies=true ...

Ou programaticamente:

System.setProperty("java.net.useSystemProxies", "true");

Fonte: http://docs.oracle .com / JavaSE / 7 / docs / api / java / / doc-net files / net-properties.html

Para definir um HTTP / HTTPS e / ou proxy SOCKS programaticamente:

...

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;
    }
}

...

Lembre-se que o HTTP proxies e meias proxies operar em diferentes níveis na pilha de rede, de modo que você pode usar um ou o outro ou ambos.

Você pode definir essas bandeiras programação desta maneira:

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

Apenas retornar os valores corretos dos métodos needsProxy(), getProxyHost() e getProxyPort() e você pode chamar este trecho de código quando quiser.

JVM usa o proxy para fazer HTTP chamadas

System.getProperties().put("http.proxyHost", "someProxyURL");
System.getProperties().put("http.proxyPort", "someProxyPort");

Isto pode usar o proxy configuração de usuário

System.setProperty("java.net.useSystemProxies", "true");

Você pode definir algumas propriedades sobre o servidor proxy como parâmetros JVM

-Dhttp.proxyPort = 8080, proxyHost, etc.

Mas se você precisa passar por um proxy de autenticação, você precisa de um autenticador como neste exemplo:

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

    }
}

Com base nesta resposta: http: // correio-arquivos. apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E

A combinação de classificador de e javabrett / respostas de Leonel:

java -Dhttp.proxyHost=10.10.10.10 -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password -jar myJar.jar

ler um arquivo e necessidades XML para transferir seu esquema

Se você está contando com a recuperação de esquemas ou DTDs através da internet, você está construindo um, chatty, aplicação frágil lento. O que acontece quando esse servidor remoto que hospeda o arquivo leva planejado ou paradas não planejadas? Suas pausas aplicativo. É isso OK?

Consulte http: //xml.apache .org / commons / componentes / resolver / resolver-article.html # s.catalog.files

URL é para esquemas e similares são melhor pensado como identificadores únicos. Não como pedidos para realmente acessar esse arquivo remotamente. Faça alguma pesquisa google sobre "catálogo XML". Um catálogo XML permite a hospedagem de tais recursos localmente, resolver a lentidão, chattiness e fragilidade.

É basicamente uma cópia permanentemente em cache do conteúdo remoto. E isso é OK, desde que o conteúdo remoto nunca vai mudar. Se há sempre uma atualização, ela estaria em um URL diferente. Fazendo a recuperação real do recurso através da internet especialmente tola.

Defina a java.net.useSystemProxies propriedade para true. Você pode configurá-lo, por exemplo, através do JAVA_TOOL_OPTIONS variável ambiental. No Ubuntu, você pode, por exemplo, adicione a seguinte linha ao .bashrc:

JAVA_TOOL_OPTIONS exportação + = "-Djava.net.useSystemProxies = true"

Eu estou também atrás do firewall, isso funcionou para mim !!

System.setProperty("http.proxyHost", "proxy host addr");
System.setProperty("http.proxyPort", "808");
Authenticator.setDefault(new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {

        return new PasswordAuthentication("domain\\user","password".toCharArray());
    }
});

URL url = new URL("http://www.google.com/");
URLConnection con = url.openConnection();

BufferedReader in = new BufferedReader(new InputStreamReader(
                    con.getInputStream()));

// Read it ...
String inputLine;
while ((inputLine = in.readLine()) != null)
    System.out.println(inputLine);

in.close();

A seguir mostra como conjunto em Java um proxy com usuário proxy e senha de proxy na linha de comando, que é um caso muito comum. Você não deve salvar senhas e anfitriões no código, como regra, em primeiro lugar.

Passando as propriedades do sistema em linha de comando com -D e colocá-los no código com System.setProperty ( "name", "value") é equivalente.

Mas note que este

exemplo que funciona:

C:\temp>java -Dhttps.proxyHost=host -Dhttps.proxyPort=port -Dhttps=proxyUser=user -Dhttps.proxyPassword="password" -Djavax.net.ssl.trustStore=c:/cacerts -Djavax.net.ssl.trustStorePassword=changeit com.andreas.JavaNetHttpConnection

Mas o seguinte não funciona

C:\temp>java com.andreas.JavaNetHttpConnection -Dhttps.proxyHost=host -Dhttps.proxyPort=port -Dhttps=proxyUser=user -Dhttps.proxyPassword="password" -Djavax.net.ssl.trustStore=c:/cacerts -Djavax.net.ssl.trustStorePassword=changeit

A única diferença é a posição das propriedades do sistema! (Antes e depois da aula)

Se você tiver caracteres especiais na senha, você tem permissão para colocá-lo entre aspas "@ MyPass123%", como no exemplo acima.

Se você acessar um serviço HTTPS, você tem que usar https.proxyHost, https.proxyPort etc.

Se você acessar um serviço HTTP, você tem que usar http.proxyHost, http.proxyPort etc.

Adicione esta antes de se conectar a um URL atrás de um proxy.

System.getProperties().put("http.proxyHost", "someProxyURL");
System.getProperties().put("http.proxyPort", "someProxyPort");
System.getProperties().put("http.proxyUser", "someUserName");
System.getProperties().put("http.proxyPassword", "somePassword");

Esta é uma pequena atualização, mas desde que Java 7, conexões proxy agora pode ser criado por meio de programação em vez de através de propriedades do sistema. Isto pode ser útil se:

  1. Proxy precisa ser girada de forma dinâmica durante a execução do programa
  2. vários proxies paralelas precisam ser usados ??
  3. Ou apenas fazer o seu código mais limpo:)

Aqui está um exemplo inventado em Groovy:

// proxy configuration read from file resource under "proxyFileName"
String proxyFileName = "proxy.txt"
String proxyPort = "1234"
String url = "http://www.promised.land"
File testProxyFile = new File(proxyFileName)
URLConnection connection

if (!testProxyFile.exists()) {

    logger.debug "proxyFileName doesn't exist.  Bypassing connection via proxy."
    connection = url.toURL().openConnection()

} else {
    String proxyAddress = testProxyFile.text
    connection = url.toURL().openConnection(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyAddress, proxyPort)))
}

try {
    connection.connect()
}
catch (Exception e) {
    logger.error e.printStackTrace()
}

Referência completa: http://docs.oracle.com/javase/7 /docs/technotes/guides/net/proxies.html

Se você quiser "Socks Proxy", informa o "socksProxyHost" e argumentos VM "socksProxyPort".

por exemplo.

java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=8080 org.example.Main

Recentemente eu descobri o caminho para permitir JVM para usar as configurações de proxy do navegador. O que você precisa fazer é adicionar ${java.home}/lib/deploy.jar ao seu projeto e para o init a biblioteca como o seguinte:

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;
    }
}

Depois as configurações de proxy estão disponíveis para API Java via java.net.ProxySelector.

O único problema com esta abordagem é que você precisa para começar a JVM com deploy.jar em bootclasspath por exemplo java -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar. Se alguém sabe como superar essa limitação, me avise.

que funciona para mim:

public void setHttpProxy(boolean isNeedProxy) {
    if (isNeedProxy) {
        System.setProperty("http.proxyHost", getProxyHost());
        System.setProperty("http.proxyPort", getProxyPort());
    } else {
        System.clearProperty("http.proxyHost");
        System.clearProperty("http.proxyPort");
    }
}

P / S:. Base de I sobre a resposta de Ghad

Como está fora apontado em outras respostas, se você precisa usar proxies autenticados, não há nenhuma maneira confiável para fazer isso puramente usando variáveis ??de linha de comando - o que é irritante se você estiver usando aplicação de outra pessoa e não quer mexer com o código-fonte.

Will Iverson faz a sugestão útil sobre a usando httpProxy se conectar a um host com preemtive autenticação usar uma ferramenta de gerenciamento de Proxy, como Proxifier ( http://www.proxifier.com/ para Mac OS X e Windows) para lidar com isso.

Por exemplo, com Proxifier você pode configurá-lo para comandos de interceptação java apenas a ser gerida e redirecionadas através de seu proxy (autenticado). Você vai querer definir os valores proxyHost e ProxyPort para em branco, neste caso, porém, por exemplo, passar em -Dhttp.proxyHost= -Dhttp.proxyPort= aos seus comandos Java.

Além disso, se você está sempre olhando para baixar o mesmo esquema, em seguida, você pode adicionar o esquema para o seu classpath (sistema de arquivos ou JAR), e, em seguida, usar um personalizado EntityResolver

aqui para uma discussão mais completa sobre esta abordagem.

Editar: Discussão Veja @ me.yahoo.com / a / de 0QMxE de CatalogResolver, que usa a abordagem EntityResolver:

CatalogResolver cr = new CatalogResolver();
...
yourParser.setEntityResolver(cr) 

Você pode utilizar os * http.proxy variáveis ??JVM se você estiver dentro de um autônomo JVM mas você não deve modificar seus scripts de inicialização e / ou fazer isso dentro de seu servidor de aplicativos (exceto talvez jboss ou tomcat). Em vez disso você deve utilizar o JAVA Proxy API (não System.setProperty) ou utilizar próprias opções de configuração do fornecedor. Ambos WebSphere e WebLogic ter muito definido formas de configurar os proxies que são muito mais potente do que o J2SE. Além disso, para WebSphere e WebLogic você provavelmente vai quebrar o seu servidor de aplicação em pequenas formas, substituindo os scripts de inicialização (em particular os processos de interoperabilidade do servidor, como você pode estar dizendo-lhes para usar o proxy também ...).

Eu acho que a configuração winhttp também funcionará.

Muitos programas, incluindo atualizações do Windows estão tendo problemas por trás proxy. Através da criação de winhttp sempre corrigir este tipo de problemas

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top