Java程序设置代理服务器

前言

前两天公司搬到新的办公楼上班,但由于网络没有打通,只能通过设置跳板机 SSH 隧道的动态代理来访问原来的内网环境,之前已经写过一篇SSH端口转发总结,通过之前的文章,就可以解决访问原内网中的浏览器资源问题,但是还有一个问题:开发过程中的程序中数据库等资源依旧无法访问,本文记录了 Java 程序如何使用代理去请求其他服务。

查看 IP 地址的API

  1. https://ip.sb/
  2. http://myip.ipip.net/
  3. https://www.ip.la/
  4. https://www.ipip.net/

Java代码使用代理

目前在我的了解范围内,我知道有两种方式实现 Java 代码使用代理(所以我不敢说只有两种方式😅),分别是:程序中设置代理、设置 JVM 启动参数。在这些方式中,我推荐使用设置 JVM 启动参数这种方式,因为它对原代码没有侵入任何内容。

程序中设置代理

java中支持 HTTP代理、HTTPS代理、Socks代理、FTP代理、本地 IE 代理等。

通过System.setProperty(key , value)进行设置。

HTTP

HTTP设置代理的参数如下:

  1. http.proxyHost
  2. http.proxyPort
  3. http.nonProxyHosts 设置不走代理服务器访问的主机,可以使用*通配符,多个地址用|分隔

测试代码:

HttpProxyTest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class HttpProxyTest {
public static void main(String[] args) {
try {
System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "1080");
// 设置不走代理服务器访问的主机,可以使用*通配符,多个地址用|分隔
System.setProperty("http.nonProxyHosts", "pv.sohu.com");

// 创建一个url实例
// http://pv.sohu.com/cityjson?ie=utf-8 该网站是一个获取ip的api
URL url = new URL("http://pv.sohu.com/cityjson?ie=utf-8");
// 通过url的openStream获取url对象所表示资源的字节输入流
InputStream is = url.openStream();
// 将字节输入流转换为字符输入流
InputStreamReader isr = new InputStreamReader(is, "utf-8");
// 为字符输入流添加缓冲
BufferedReader br = new BufferedReader(isr);
StringBuffer stringBuffer = new StringBuffer();
String line;
// 读取数据
while ((line = br.readLine()) != null) {
stringBuffer.append(line);
}
br.close();
isr.close();
is.close();
System.out.println(stringBuffer.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

HTTPS

HTTPS设置代理的参数如下:

  1. https.proxyHost
  2. https.proxyPort

注意:它没有https.nonProxyHosts属性,它按照http.nonProxyHosts中设置的规则访问

测试代码:

HttpsProxyTest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class HttpsProxyTest {
public static void main(String[] args) {
try {
System.setProperty("https.proxyHost", "127.0.0.1");
System.setProperty("https.proxyPort", "1080");
// 经过验证,https 没有https.nonProxyHosts属性,但是http.nonProxyHosts,对其生效
System.setProperty("https.nonProxyHosts", "ipv4.ip.sb");

// 创建一个url实例
// https://ip.sb/ 该网站是一个获取ip的api
URL url = new URL("https://ipv4.ip.sb/addrinfo.php?callback=callback");
// 通过url的openStream获取url对象所表示资源的字节输入流
InputStream is = url.openStream();
// 将字节输入流转换为字符输入流
InputStreamReader isr = new InputStreamReader(is, "utf-8");
// 为字符输入流添加缓冲
BufferedReader br = new BufferedReader(isr);
StringBuffer stringBuffer = new StringBuffer();
String line;
// 读取数据
while ((line = br.readLine()) != null) {
stringBuffer.append(line);
}
br.close();
isr.close();
is.close();
System.out.println(stringBuffer.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

FTP

FTP设置代理参数如下:

  1. ftp.proxyHost
  2. ftp.proxyPort
  3. ftp.nonProxyHosts

由于没有真正的FTP代理测试环境,因此没有代码😅。

Socks

Socks 代理是最强大的,它能实现以上所有代理。数据库的JDBC内网连接就是通过 Socks 代理实现。

Socks设置代理参数如下:

  1. socksProxyHost
  2. socksProxyPort

测试代码:

SocksProxyTest
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class SocksProxyTest {
public static void main(String[] args) {
try {
System.setProperty("socksProxyHost", "127.0.0.1");
System.setProperty("socksProxyPort", "1080");

// 创建一个url实例
// http://pv.sohu.com/cityjson?ie=utf-8 该网站是一个获取ip的api
// URL url = new URL("http://pv.sohu.com/cityjson?ie=utf-8");
URL url = new URL("https://ipv4.ip.sb/addrinfo.php?callback=callback");

// 通过url的openStream获取url对象所表示资源的字节输入流
InputStream is = url.openStream();
// 将字节输入流转换为字符输入流
InputStreamReader isr = new InputStreamReader(is, "utf-8");
// 为字符输入流添加缓冲
BufferedReader br = new BufferedReader(isr);
StringBuffer stringBuffer = new StringBuffer();
String line;
// 读取数据
while ((line = br.readLine()) != null) {
stringBuffer.append(line);
}
br.close();
isr.close();
is.close();
System.out.println(stringBuffer.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

本地 IE 代理

本地 IE 代理设置代理参数如下:

  1. java.net.useSystemProxies

测试代码:(通过设置本地可以查看效果)

SystemProxy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class SystemProxy {
public static void main(String[] args) {
try {
System.setProperty("java.net.useSystemProxies", "true");

// 创建一个url实例
// http://pv.sohu.com/cityjson?ie=utf-8 该网站是一个获取ip的api
URL url = new URL("http://pv.sohu.com/cityjson?ie=utf-8");
// 通过url的openStream获取url对象所表示资源的字节输入流
InputStream is = url.openStream();
// 将字节输入流转换为字符输入流
InputStreamReader isr = new InputStreamReader(is, "utf-8");
// 为字符输入流添加缓冲
BufferedReader br = new BufferedReader(isr);
StringBuffer stringBuffer = new StringBuffer();
String line = null;
// 读取数据
while ((line = br.readLine()) != null) {
stringBuffer.append(line);
}
br.close();
isr.close();
is.close();
System.out.println(stringBuffer.toString());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

Java启动参数设置代理

Java可以通过设置以下命令来实现System.setProperty(key , value)这行代码。

1
-D<key>=<value>

HTTP

  1. -Dhttp.proxyHost
  2. -Dhttp.proxyPort
  3. -Dhttp.nonProxyHosts

HTTPS

  1. -Dhttps.proxyHost
  2. -Dhttps.proxyPort

FTP

  1. -Dftp.proxyHost
  2. -Dftp.proxyPort
  3. -Dftp.nonProxyHosts

Socks

  1. -DsocksProxyHost
  2. -DsocksProxyPort

本地代理

  1. -Djava.net.useSystemProxies
如果喜欢, 请给我加个🍗~
0%