前言
如果翻过墙,或者做过渗透啥的,肯定对代理不陌生,说白了,代理服务器就是一个中转站,你对目标网址的请求都会进过代理服务器去请求,类似于一个被你操控的傀儡,别人能知道的也只能是这个代理,从而提升安全性和访问一些受限制的网站。
实现
方法一 :使用系统属性来完成代理设置, 这种方法比较简单, 但是不能对单独的连接来设置代理:
public static void main(String[] args) {
Properties prop = System.getProperties();
// 设置http访问要使用的代理服务器的地址
prop.setProperty("http.proxyHost", "192.168.0.254");
// 设置http访问要使用的代理服务器的端口
prop.setProperty("http.proxyPort", "8080");
// 设置不需要通过代理服务器访问的主机,可以使用*通配符,多个地址用|分隔
prop.setProperty("http.nonProxyHosts", "localhost|192.168.0.*");
// 设置安全访问使用的代理服务器地址与端口
// 它没有https.nonProxyHosts属性,它按照http.nonProxyHosts 中设置的规则访问
prop.setProperty("https.proxyHost", "192.168.0.254");
prop.setProperty("https.proxyPort", "443");
// 使用ftp代理服务器的主机、端口以及不需要使用ftp代理服务器的主机
prop.setProperty("ftp.proxyHost", "192.168.0.254");
prop.setProperty("ftp.proxyPort", "2121");
prop.setProperty("ftp.nonProxyHosts", "localhost|192.168.0.*");
// socks代理服务器的地址与端口
prop.setProperty("socksProxyHost", "192.168.0.254");
prop.setProperty("socksProxyPort", "8000");
// 设置登陆到代理服务器的用户名和密码
Authenticator.setDefault(new MyAuthenticator("userName", "Password"));
}
static class MyAuthenticator extends Authenticator {
private String user = "";
private String password = "";
public MyAuthenticator(String user, String password) {
this.user = user;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
returnnew PasswordAuthentication(user, password.toCharArray());
}
}
方法二使用Proxy来对每个连接实现代理, 这种方法只能在jdk 1.5以上的版本使用(包含jdk1.5), 优点是可以单独的设置每个连接的代理, 缺点是设置比较麻烦:
public static void main(String[] args) {
try {
URL url = new URL("http://www.baidu.com");
// 创建代理服务器
InetSocketAddress addr = new InetSocketAddress("192.168.0.254",8080);
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr); // http 代理
// 如果我们知道代理server的名字, 可以直接使用
URLConnection conn = url.openConnection(proxy);
InputStream in = conn.getInputStream();
String s = IOUtils.toString(in);
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
测试
下面的代码分别测试了不使用代理,设置全局代理,为单个连接设置代理3中情况。(测试代码中的代理为网上找的免费代理,响应速度,稳定性极差),如果代理无响应,java还会自动切换到本地请求。
public static void main(String[] args) throws InterruptedException, IOException {
// 目标网址,会返回发起请求的ip
URL url1 = new URL("http://ip.chinaz.com/getip.aspx");
// 不设置任何代理
String result1 = printInputstream(url1.openStream());
System.out.println(" 不设置任何代理:" + result1);
/**
* 方式一
*/
Properties prop = System.getProperties();
// 设置http访问要使用的代理服务器的地址
prop.setProperty("http.proxyHost", "120.35.30.178");
// 设置http访问要使用的代理服务器的端口
prop.setProperty("http.proxyPort", "80");
System.setProperties(prop);
URL url2 = new URL("http://ip.chinaz.com/getip.aspx");
String result2 = printInputstream(url2.openStream());
System.out.println(" 设置全局代理:" + result2);
/**
* 方法二
*/
// 创建代理服务器
InetSocketAddress addr = new InetSocketAddress("220.202.127.78", 8118);
// http 代理
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);
URL url3 = new URL("http://ip.chinaz.com/getip.aspx");
URLConnection conn = url3.openConnection(proxy);
conn.setReadTimeout(5000);
String result3 = printInputstream(conn.getInputStream());
System.out.println(" 为当前请求设置代理:" + result3);
}
public static String printInputstream(InputStream in) {
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
reader = new BufferedReader(new InputStreamReader(in));
String s = null;
StringBuffer sb = new StringBuffer();
try {
while ((s = reader.readLine()) != null) {
sb.append(s);
}
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
output:
不设置任何代理:{ip:'61.183.248.220',address:'湖北省武汉市 电信'}
设置全局代理:{ip:'120.35.29.248',address:'福建省福州市 电信'}
为当前请求设置代理:{ip:'220.202.127.78',address:'湖南省长沙市 联通'}
参考网址:开源中国
分享是美德,谢谢博主的分享。
@凯哥自媒体 谢谢