当前位置:  开发笔记 > 编程语言 > 正文

如何设置JVM使用的代理

如何解决《如何设置JVM使用的代理》经验,为你挑选了12个好方法。

很多时候,Java应用程序需要连接到Internet.最常见的示例发生在读取XML文件并需要下载其架构时.

我在代理服务器后面.如何设置JVM以使用代理?



1> Leonel..:

从Java文档(不是 javadoc API):

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

设置JVM标志http.proxyHost以及http.proxyPort在命令行上启动JVM时.这通常在shell脚本(在Unix中)或bat文件(在Windows中)中完成.这是Unix shell脚本的示例:

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

使用JBoss或WebLogic等容器时,我的解决方案是编辑供应商提供的启动脚本.

许多开发人员都熟悉Java API(javadocs),但很多时候其他文档都被忽略了.它包含许多有趣的信息:http://download.oracle.com/javase/6/docs/technotes/guides/


更新:如果您不想使用代理解析某些本地/内部网主机,请查看@Tomalak的注释:

另外不要忘记http.nonProxyHosts属性!

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


+1.另外不要忘记`http.nonProxyHosts`属性!(使用如下:`-Dhttp.nonProxyHosts ="localhost | 127.0.0.1 | 10.*.*.*|*.foo.com | etc"`)
另外,不要忘记为HTTP配置`https.proxyHost`和`https.proxyPort`.
@Joeblackdev查看http.proxyUser和http.proxyPassword
@aasukisuki`http.proxyUser`和`http.proxyPassword`不是Java系统属性.它们用于Apache HTTP客户端.
大家好,你怎么能在这包括用户名和密码?谢谢

2> gr5..:

要使用系统代理设置:

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

或者以编程方式:

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

资料来源:http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html


这不适用于代理自动配置(PAC)文件,请参阅/sf/ask/17360801/

3> Chris Carrut..:

以编程方式设置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代理在网络堆栈中的不同级别运行,因此您可以使用其中一个或两个.


如果设置了"java.net.socks.username/password",为什么*还*设置一个Authenticator?

4> GHad..:

您可以通过以下方式编程设置这些标志:

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

单从方法返回正确的价值观needsProxy(),getProxyHost()并且getProxyPort()你可以打电话,只要你想这个代码片断.


"proxySet"什么都不做.证明:将其设置为"false".JDK中没有也从未有过这样的属性,尽管有各种书籍和在线参考.它来自长期不复存在的HotJavaBean,一个封装的浏览器,在1998年死于死亡.
这有三个错误:1:如上所述,没有"proxySet"项; 2:"proxyHost"和"proxyPort"需要是"http.proxyHost"和"http.proxyPort"(或'https'等价物); 3:System.getProperties().put(X,Y)与System.setProperty(X,Y)*不相同.除此之外,虽然 - 很好的答案.
真的是没有http/https的属性名称?

5> 小智..:

JVM使用代理进行HTTP调用

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

这可以使用用户设置代理

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



6> Alex. S...:

您可以将代理服务器的某些属性设置为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



7> Bamboomy..:

结合Sorter和javabrett/Leonel的答案:

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



8> Mihai Capotă..:

java.net.useSystemProxies属性设置为true.例如,您可以通过JAVA_TOOL_OPTIONS环境变量进行设置.例如,在Ubuntu中,您可以将以下行添加到.bashrc:

export JAVA_TOOL_OPTIONS + =" - Djava.net.useSystemProxies = true"



9> John M..:

读取XML文件并需要下载其架构

如果您指望通过互联网检索模式或DTD,那么您正在构建一个缓慢,繁琐,脆弱的应用程序.当托管文件的远程服务器需要计划内或计划外停机时会发生什么?你的应用中断了.这可以吗?

请参阅http://xml.apache.org/commons/components/resolver/resolver-article.html#s.catalog.files

模式等的URL最好被认为是唯一标识符.不是远程实际访问该文件的请求.做一些谷歌搜索"XML目录".XML目录允许您在本地托管此类资源,解决缓慢,烦躁和脆弱的问题.

它基本上是远程内容的永久缓存副本.这没关系,因为远程内容永远不会改变.如果有更新,它将在不同的URL.通过互联网实际检索资源尤其愚蠢.



10> Andreas Pana..:

下面显示了如何在Java中使用代理用户和代理密码从命令行设置代理,这是一种非常常见的情况.首先,您不应该在代码中保存密码和主机.

使用-D在命令行中传递系统属性并使用System.setProperty("name","value")在代码中设置它们是等效的.

但请注意这一点

有效的示例:

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

但以下不起作用

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

唯一的区别是系统属性的位置!(课前和课后)

如果您在密码中有特殊字符,则可以将其放在引号"@ MyPass123%"中,如上例所示.

如果您访问HTTPS服务,则必须使用https.proxyHost,https.proxyPort等.

如果访问HTTP服务,则必须使用http.proxyHost,http.proxyPort等.


ProxyUser和proxyPassword不是Java系统属性,而是Apache HTTP客户端属性,因此在所有情况下都不起作用.

11> 小智..:

我也在防火墙后面,这对我有用!!

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();



12> 小智..:

如果要“ Socks代理”,请通知“ socksProxyHost”和“ socksProxyPort” VM参数。

例如

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

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有