代理有助于减少安全性的外部威胁,同时还允许内部用户访问因特网服务
有两种代理实现方式
一、设置系统属性
通过设置系统属性(System.setPropery(String key, String value)的方式,这种方式会影响所有的请求,
可用的网络代理属性,请参照
http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html
1、设置代理
System.setProperty("java.net.useSystemProxies", "true");
// HTTP代理
System.setProperty("http.proxyHost", proxyHost);
System.setProperty("http.proxyPort", proxyPort + "");
// HTTPS代理
System.setProperty("https.proxyHost", proxyHost);
System.setProperty("https.proxyPort", proxyPort + "");
2、获取代理
/**
* 获取代理
*
* @param url
* @return
*/
private static Proxy getSystemProxy(String url) {
Proxy proxy = null;
try {
ProxySelector ps = ProxySelector.getDefault();
List<Proxy> proxyList = ps.select(new URI(url));
if (null != proxyList && !proxyList.isEmpty()) {
proxy = proxyList.get(0);
}
} catch (Exception e) {
e.printStackTrace();
}
return proxy;
}
二、java.net.Proxy
本方式只对当前请求起作用
InetSocketAddress inetAddress= new InetSocketAddress(proxyHost,proxyPort);
//创建代理
Proxy proxy = new Proxy(Proxy.Type.HTTP,inetAddress);
//设置代理
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
三、代理认证
有些代理在授权用户访问因特网之前,要求用户输入用户名和口令。如果您使用位于防火墙之内的Web浏览器,
您就可能碰到过这种情况。以下是执行认证的方法:
1、Authenticator
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username,password);
}
});
这种方式是全局的,对所有请求生效。
String auth="username:password";
String encodedAuth=base64Encode(auth);
String header="Proxy-Authorization: basic "+encodedAuth;
只对当前请求生效。