Java HTTP代理设置以及认证

时间:2022-03-09 16:59:22

代理设置

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