Java 如何设置服务器代理

本地可以 curl 通,本地代码也可以通。
服务器 curl 通,服务器代码不可以通。

原因:

java 未配置代理,或 代理配错了。

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
[root@easy-promo-756f954644-n9hvd easy-promo]# vi A.java 
[root@easy-promo-756f954644-n9hvd easy-promo]# Z
bash: Z: command not found
[root@easy-promo-756f954644-n9hvd easy-promo]#
[root@easy-promo-756f954644-n9hvd easy-promo]#
[root@easy-promo-756f954644-n9hvd easy-promo]#
[root@easy-promo-756f954644-n9hvd easy-promo]#
[root@easy-promo-756f954644-n9hvd easy-promo]# javac A.java ; java A
2021-04-14 10:22:12

>>> 连接 前
Exception in thread "main" java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:607)
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:284)
at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264)
at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:167)
at A.main(A.java:61)
[root@easy-promo-756f954644-n9hvd easy-promo]#

配置 java代理的两种方式:

1(推荐:java -D 参数配置)、六个 -D 参数。
-Dhttps.proxyHost=10.71.252.20 -Dhttps.proxyPort=3128 -Dhttp.proxyHost=10.71.252.20 -Dhttp.proxyPort=3128 -Dhttp.nonProxyHosts=10.0.0.0/8,40.73.0.0/16,service.azk8s.cn,dktapp.cloud,subsidia.org,dktinfra.cloud -Dhttps.nonProxyHosts=10.0.0.0/8,40.73.0.0/16,service.azk8s.cn,dktapp.cloud,subsidia.org,dktinfra.cloud

》》》Dockerfile 配置
在这里插入图片描述

》》》命令行
在这里插入图片描述

2(了解:System.setProperty 配置)、调用前,设置系统环境变量。(其实上面的 -D 参数也是读取到 System 中,只不过是初始化就读取了)

1
2
3
4
5
6
7
8
9
10
11
12
System.setProperty("http.proxyHost", "10.71.252.20");
System.setProperty("http.proxyPort", "3128");
System.setProperty("https.proxyHost", "10.71.252.20");
System.setProperty("https.proxyPort", "3128");
System.setProperty("http.nonProxyHosts", "10.0.0.0/8,40.73.0.0/16,service.azk8s.cn,dktapp.cloud,subsidia.org,dktinfra.cloud");
System.setProperty("https.nonProxyHosts", "10.0.0.0/8,40.73.0.0/16,service.azk8s.cn,dktapp.cloud,subsidia.org,dktinfra.cloud");

// 若需要账号名,密码。可以再此配置。
//System.setProperty("http.proxyUser", Constant.proxyUser);
//System.setProperty("http.proxyPassword", Constant.proxyPassword);
//System.setProperty("https.proxyUser", Constant.proxyUser);
//System.setProperty("https.proxyPassword", Constant.proxyPassword);

curl 代理(给 Linux 配置 env 环境变量):

1
2
3
https_proxy: "http://10.71.252.20:3128"
http_proxy: "http://10.71.252.20:3128"
no_proxy: "10.0.0.0/8,40.73.0.0/16,service.azk8s.cn,dktapp.cloud,subsidia.org,dktinfra.cloud"

坑:

1、配置的 proxyHost 不能加上 http 协议,直接写域名或 ip地址即可。

》》》错误配置
ENV PROXY=”-Dhttps.proxyHost=http://10.71.252.20 -Dhttps.proxyPort=3128 -Dhttp.proxyHost=http://10.71.252.20 -Dhttp.proxyPort=3128 -Dhttp.nonProxyHosts=10.0.0.0/8,40.73.0.0/16,service.azk8s.cn,dktapp.cloud,subsidia.org,dktinfra.cloud -Dhttps.nonProxyHosts=10.0.0.0/8,40.73.0.0/16,service.azk8s.cn,dktapp.cloud,subsidia.org,dktinfra.cloud”

》》》正确配置
ENV PROXY=”-Dhttps.proxyHost=10.71.252.20 -Dhttps.proxyPort=3128 -Dhttp.proxyHost=10.71.252.20 -Dhttp.proxyPort=3128 -Dhttp.nonProxyHosts=10.0.0.0/8,40.73.0.0/16,service.azk8s.cn,dktapp.cloud,subsidia.org,dktinfra.cloud -Dhttps.nonProxyHosts=10.0.0.0/8,40.73.0.0/16,service.azk8s.cn,dktapp.cloud,subsidia.org,dktinfra.cloud”

2、访问的地址不论是 http 还是 https,把代理都配上,在上面配置 java代理的两种方式,里面说了,一共六个参数,最好都配置上。
(避免:你访问的 https 只配置了 http 代理)

java原生代码

直接把 java 放服务器 java环境,跑起来。避免繁琐的打包,走 CI/CD,再发送请求进行测试。

1
2
vi A.java
javac A.java ; java A
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package com.decathlon.easypromo;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.time.LocalDateTime;

/**
* 代理。访问 oms 服务器测试
*
* @author 陶攀峰
* @version 1.0
* @date 2021/4/14 上午8:34
*/
public class A {
//2021/4/14 上午8:34
public static void main(String[] args) throws Exception {
System.out.println(LocalDateTime.now().toString().replaceAll("T", " ").split("\\.")[0] + "\n");


//键 值
//no_proxy 10.0.0.0/8,40.73.0.0/16,service.azk8s.cn,dktapp.cloud,subsidia.org,dktinfra.cloud
//https_proxy http://10.71.252.20:3128
//http_proxy http://10.71.252.20:3128



// -Dhttp.proxyHost=http://10.71.252.20
// -Dhttp.proxyPort=3128
// -Dhttps.proxyHost=http://10.71.252.20
// -Dhttps.proxyPort=3128
// -Dhttp.nonProxyHosts=10.0.0.0/8,40.73.0.0/16,service.azk8s.cn,dktapp.cloud,subsidia.org,dktinfra.cloud
// -Dhttps.nonProxyHosts=10.0.0.0/8,40.73.0.0/16,service.azk8s.cn,dktapp.cloud,subsidia.org,dktinfra.cloud

System.setProperty("http.proxyHost", "10.71.252.20");
System.setProperty("http.proxyPort", "3128");
System.setProperty("https.proxyHost", "10.71.252.20");
System.setProperty("https.proxyPort", "3128");
System.setProperty("http.nonProxyHosts", "10.0.0.0/8,40.73.0.0/16,service.azk8s.cn,dktapp.cloud,subsidia.org,dktinfra.cloud");
System.setProperty("https.nonProxyHosts", "10.0.0.0/8,40.73.0.0/16,service.azk8s.cn,dktapp.cloud,subsidia.org,dktinfra.cloud");
//System.setProperty("http.proxyUser", Constant.proxyUser);
//System.setProperty("http.proxyPassword", Constant.proxyPassword);

// 1. 获取访问地址URL
URL url = new URL("https://oms-preprod.decathlon.com.cn:9443/oms-service/api/auth");
// 2. 创建HttpURLConnection对象
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
/* 3. 设置请求参数等 */
// 请求方式
connection.setRequestMethod("POST");
// 超时时间
connection.setConnectTimeout(3000);
// 设置是否输出
connection.setDoOutput(true);
// 设置是否读入
connection.setDoInput(true);
// 设置是否使用缓存
connection.setUseCaches(false);
// 设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向
connection.setInstanceFollowRedirects(true);
// 设置使用标准编码格式编码参数的名-值对
connection.setRequestProperty("Content-Type", "application/json");

System.out.println(">>> 连接 前");
// 连接
connection.connect();
System.out.println(">>> 连接 后");
/* 4. 处理输入输出 */
// 写入参数到请求中
String body = "此处为了发表文章,省略";
OutputStream out = connection.getOutputStream();
out.write(params.getBytes());
out.flush();
out.close();



// 从连接中读取响应信息
StringBuilder sb = new StringBuilder();
int code = connection.getResponseCode();
if (code == 200) {
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;

while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
reader.close();
}
// 5. 断开连接
connection.disconnect();

// 处理结果
System.out.println("响应消息:" + sb.toString());
}


}