Answers:
从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"
http.nonProxyHosts
财产!(使用这样的:-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com|etc"
)
http.proxyUser
而http.proxyPassword
不是Java系统属性。它们用于Apache HTTP客户端。
https.proxyHost
和https.proxyPort
。
要使用系统代理设置:
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
要以编程方式设置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代理在网络堆栈中的不同级别上运行,因此您可以使用其中一个或两个。
您可以通过以下方式以编程方式设置这些标志:
if (needsProxy()) {
System.setProperty("http.proxyHost",getProxyHost());
System.setProperty("http.proxyPort",getProxyPort());
} else {
System.setProperty("http.proxyHost","");
System.setProperty("http.proxyPort","");
}
单从方法返回正确的价值观needsProxy()
,getProxyHost()
并且getProxyPort()
你可以打电话,只要你想这个代码片断。
JVM使用代理进行HTTP调用
System.getProperties().put("http.proxyHost", "someProxyURL");
System.getProperties().put("http.proxyPort", "someProxyPort");
这可能使用用户设置代理
System.setProperty("java.net.useSystemProxies", "true");
System.setProperty
代替System.getProperties().put(...)
您可以将有关代理服务器的某些属性设置为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;
}
}
范例.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
将java.net.useSystemProxies
属性设置为true
。您可以例如通过JAVA_TOOL_OPTIONS环境变量进行设置。例如,在Ubuntu中,您可以将以下行添加到.bashrc
:
导出JAVA_TOOL_OPTIONS + =“ -Djava.net.useSystemProxies = true”
下面显示了如何在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
等等。
读取XML文件并需要下载其架构
如果您指望通过Internet检索模式或DTD,那么您正在构建一个缓慢,健谈,易碎的应用程序。当托管文件的远程服务器发生计划内或计划外停机时,会发生什么情况?您的应用中断了。这可以吗?
参见http://xml.apache.org/commons/components/resolver/resolver-article.html#s.catalog.files
最好将模式等的URL视为唯一标识符。并非要求实际远程访问该文件。做一些谷歌搜索“ XML目录”。XML目录使您可以在本地托管此类资源,从而解决了速度慢,聊天混乱和脆弱的问题。
它基本上是远程内容的永久缓存副本。没关系,因为远程内容永远不会改变。如果有更新,则将使用其他URL。使通过Internet进行资源的实际检索特别愚蠢。
我也在防火墙后面,对我有用!!
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();
在连接到代理后面的URL之前,请添加此内容。
System.getProperties().put("http.proxyHost", "someProxyURL");
System.getProperties().put("http.proxyPort", "someProxyPort");
System.getProperties().put("http.proxyUser", "someUserName");
System.getProperties().put("http.proxyPassword", "somePassword");
http.proxyUser
并且http.proxyPassword
不是Java系统属性。它们用于Apache HTTP客户端。
System.setProperty
代替System.getProperties().put(...)
这是一个较小的更新,但是自Java 7起,现在可以以编程方式而不是通过系统属性来创建代理连接。这在以下情况下可能有用:
这是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()
}
完整参考:http : //docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html
最近,我发现了允许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
。
这种方法的唯一问题是,您需要deploy.jar
在bootclasspath中使用来启动JVM java -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar
。如果有人知道如何克服此限制,请告诉我。
xbootclasspath
指向deploy.jar 的指示有什么作用,我不能把那个jar放到我的普通类路径中(在没有webstart的情况下运行)?
Exception in thread "main" java.lang.IllegalAccessError: class ...) cannot access class com.sun.deploy.net.proxy.DeployProxySelector (in module jdk.deploy) because module jdk.deploy does not export com.sun.deploy.net.proxy
这对我行得通:
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:我基于GHad的回答。
正如其他答案所指出的那样,如果您需要使用身份验证代理,则没有可靠的方法仅使用命令行变量来执行此操作-如果您使用的是其他人的应用程序并且不想弄乱该代理程序,这将很烦人。源代码。
Will Iverson在“ 使用HttpProxy连接到具有预先身份验证的主机”上提出了有用的建议,以使用代理管理工具(例如Proxifier(对于Mac OS X和Windows为http://www.proxifier.com/)来处理此问题。
例如,使用Proxifier,您可以将其设置为仅拦截通过其(已认证的)代理进行管理和重定向的Java命令。但是,在这种情况下,您将想要将proxyHost和proxyPort值设置为空白,例如,传递-Dhttp.proxyHost= -Dhttp.proxyPort=
给您的Java命令。
如果您位于独立的JVM中,则可以使用http.proxy * JVM变量,但不应修改它们的启动脚本和/或在应用程序服务器中执行此操作(也许jboss或tomcat除外)。相反,您应该使用JAVA代理API(而不是System.setProperty)或使用供应商自己的配置选项。WebSphere和WebLogic都有非常明确的设置代理的方法,这些方法比J2SE的功能强大得多。此外,对于WebSphere和WebLogic,您可能会通过覆盖启动脚本(特别是服务器的互操作进程,因为您可能会告诉它们也使用代理...)以很少的方式破坏应用程序服务器。