Java后端通过代理服务器请求网络资源

1.需求

部署在内网服务器的JavaWeb项目,后端需要访问互联网,通过有网络访问权限的另一台服务器的代理转发实现互联网访问。

2.实现

内网设备——设为A,通过外网设备——设为B,访问互联网,需要分别在A和B上进行代理配置。此时它们的相对关系是,A为客户端,B为服务端,A的所有互联网请求均发送给B,B代为转发给目标站点——设为X。X返回的数据亦由B代为转发给A。

后端Java程序一般都使用apache的httpClient进行网络资源请求。通过查资料得知,httpClient使用代理服务器进行网络请求的配置方法大致可以分为两种:

1.配置httpClient参数;

2.配置JVM系统代理(注意,不是操作系统)。

第二种可能主要用于开发环境,如IDEA或eclipse等。这里主要讨论第一种方式。

配置httpClient参数

1.极简模式

// proxyHost -- 代理ip; proxyPort -- 代理端口号;HTTP -- 通讯协议
HttpHost httpProxy = new HttpHost(proxyHost, proxyPort, "HTTP");
CloseableHttpClient httpClient = HttpClients.createDefault();
// url -- 资源路径
HttpPost request = new HttpPost(url);
request.setEntity(new StringEntity("上送的报文", "utf-8"));
CloseableHttpResponse response = httpClient.execute(httpProxy, request);

这种方式要注意一点:new HttpHost()是支持指定协议类型的,但是httpClient不默认支持socks协议,所以如果我们把上面代码中的协议改成new HttpHost("proxyHost", proxyPort, "SOCKS"),会报错。”——引用自:Richard_易 2018.03.15

2.官方推荐

A. 使用RequestConfig配置类:

// proxyHost -- 代理ip; proxyPort -- 代理端口号;HTTP -- 通讯协议
HttpHost httpProxy = new HttpHost(proxyHost, proxyPort, "HTTP");
// url -- 资源地址
HttpPost request = new HttpPost(url);
request.setEntity(new StringEntity("上送的报文", "utf-8"));
CloseableHttpClient httpClient = HttpClients.createDefault();
// configUtils -- 自定义配置类对象
RequestConfig requestConfig = RequestConfig.custom()
        .setConnectionRequestTimeout(configUtils.getConnectTimeout())
        .setConnectTimeout(configUtils.getConnectTimeout())
        .setSocketTimeout(configUtils.getSocketTimeout())
        .setProxy(configUtils.isUseProxy() ? httpProxy : null)
        .build();
request.setConfig(requestConfig);
CloseableHttpResponse response = httpClient.execute(request);

B.使用RoutePlanner类:

设置默认参数的方法

// proxyHost -- 代理ip; proxyPort -- 代理端口号
HttpHost httpProxy = new HttpHost("proxyHost", "proxyPort"); 
DefaultProxyRoutePlanner routePlanner = new DefaultProxyRoutePlanner(httpProxy); 
CloseableHttpClient httpclient = HttpClients.custom()
        .setRoutePlanner(routePlanner)
        .build();

注:此方法另有一种“使用系统代理”的实现,此处暂不赘述,参考下方链接1。

 

另,使用httpClient进行https请求时可能会有SSL证书识别的问题,可参考下方链接2解决。

3.参考资料

1.httpClient使用代理的主要设置方式

2.httpClient设置忽略SSL

你可能感兴趣的:(javaWeb,java,http,httpClient,代理)