代理设置
java http/https设置代理有两种方式:使用系统属性设置以及使用Proxy设置。
使用系统属性设置代理
String PROXY_HOST = "127.0.0.1";//代理服务器地址
String PROXY_PORT = "80";//代理服务器端口
//HTTP代理
System.setProperty("http.proxyHost", PROXY_HOST);
System.setProperty("http.proxyPort", PROXY_PORT);
//HTTPS代理
System.setProperty("https.proxyHost", PROXY_HOST);
System.setProperty("https.proxyPort", PROXY_PORT);
使用系统属性设置代理是全局,应用程序里所有的http/https请求都会发往代理服务器,由代理服务器向目标服务器完成请求。
如果部分http/https请求不需要经过代理,可以使用系统属性‘nonProxyHosts’设置,它的值可以为主机列表,主机之间使用“|”分隔,也可以使用*号匹配多个主机。
Java网络属性参考:Networking Properties
使用Proxy设置代理
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
URLConnection conn = url.openConnection(proxy);
与使用系统属性设置全局代理不同,使用proxy可以为请求使用不同的代理。
认证
有些代理服务主机需要客户机认证。
全局认证
Java使用jave.net.Authenticator提供网络连接的认证信息,Authenticator是一个抽象类,它需要子类实现getPasswordAuthentication()方法来提供用于认证的密码信息。
示例:
public class BasicAuthenticator extends Authenticator {
String userName;
String password;
public BasicAuthenticator(String userName, String password) {
this.userName = userName;
this.password = password;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password.toCharArray());
}
}
除了实现Authenticator类外,还需要调用Authenticator的setDefault()方法来注册BasicAutheticator实例。
Authenticator.setDefault(new BasicAuthenticator(userName, password));
注册的这个实例是系统全局的。所有请求都会提供由BasicAutheticator的Basic认证的信息。
请求头信息认证
除了使用java的jave.net.Authenticator提供的全局认证外,也可以在请求头信息里包含认证信息。
String headerKey = "Proxy-Authorization";
String encoded = new String(Base64.encodeBase64((new String(username + ":" + password).getBytes())));
String headerValue = "Basic " + encoded;
conn.setRequestProperty(headerKey, headerValue);