关于如何使用java代码设置代理服务器
在今年年底和外资合作做的一个项目中,由于客户限制了服务器的外网访问权限,导致很多涉及到了第三方的API都无法进行访问,小编给项目组的成员提了一个建议
由于项目组的开发人员公共使用的调用第三方的工具类是基于
org.springframework.web.client.RestTemplate进行开发的,所以本节我们就讲解RestTemplate中如何使用java代理
1.)当使用的代理服务器不需要密码验证时(使用系统参数进行设置代理)'作用域:整个系统'
static {
String proxyHost = "代理的ip地址或域名";
String proxyPort = "代理的端口";
System.getProperties().setProperty("proxySet", "true");
System.getProperties().setProperty("http.proxyHost", proxyHost);
System.getProperties().setProperty("http.proxyPort", proxyPort);
System.getProperties().setProperty("https.proxyHost", proxyHost);
System.getProperties().setProperty("https.proxyPort", proxyPort);
}
上面这一部分代码可以放到RestTemplate工具类中,在项目进行启动的时候就进行全局设置代理,这个方法的作用范围是整个系统;
2.)当使用的代理服务器不需要密码验证时(使用Proxy设置代理)'作用域:指定的请求URL'
public String getData(String url, Map<String, String> param) throws IOException {
// 设置代理
SocketAddress socketAddress = new InetSocketAddress("代理的ip地址或域名", 代理的端口);
Proxy proxy = new Proxy(Proxy.Type.HTTP, socketAddress);
URL proxyUrl = new URL(url);
proxyUrl.openConnection(proxy);
// 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
return restTemplate.getForEntity(url, String.class, param).getBody();
}
3.)当使用的代理服务器需要密码验证时(使用Proxy设置代理)作用域:指定的URL
由于代理服务器需要密码验证,所以我们需要使用java.net.Authenticator.Authenticator.setDefault(Authenticator authenticator)来注册实现密码验证
public class AuthenticatorUtil extends Authenticator {
// 代理服务器用户名
private String user = "";
//代理服务器密码
private String password = "";
public MyAuthenticator(String user, String password) {
this.user = user;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password.toCharArray());
}
}
public String getData(String url, Map<String, String> param) throws IOException {
// TODO: 2023/1/5 设置代理服务器用户名和密码
Authenticator.setDefault(new AuthenticatorUtil("username", "password"));
// TODO: 2023/1/5 设置代理服务器的ip地址(域名)和端口
SocketAddress socketAddress = new InetSocketAddress("代理的ip地址或域名", 代理的端口);
Proxy proxy = new Proxy(Proxy.Type.HTTP, socketAddress);
URL proxyUrl = new URL(url);
proxyUrl.openConnection(proxy);
// 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
return restTemplate.getForEntity(url, String.class, param).getBody();
}
Java在请求某些不受信任的https网站时会报:'PKIX path building failed'
这个问题也是在做开发的时候遇到的,报错如下
"I/0 error on PosT reguest for "https://sfapi-sbox,sf-express.com/std/service ": sunsecurity.validator.ValidatorException: PKIX pathbuilding failed: sun,security,provider.certpathSunCertPathbuilderException: unable to find valid certification path to reguested target; nestedexception is iavax.net.ssl.SSLHandshakeException: sun,security.validator.ValidatorException: PKIX pathbuilding failed: sun,security.provider,certpath,SunCertPathbuilderException: unable to find validcertification-path to requested target"
有些小伙伴看到这个报错,可能以为是请求不通,其实并不是,而是https://sfapi-sbox,sf-express.com/std/service这个地址不受信任,使用https进行请求的话,所以就有了下面的工具类,用程序重新方法,信任所有的SSL证书
package com.vca.common.utils;
import lombok.SneakyThrows;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.net.ssl.*;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
/**
* @Description:信任所有证书工具类
* @author:chenbing
* @date 2023/1/4 17:40
*/
public class SslUtil {
//创建日志记录工具
public static final Logger logger = LoggerFactory.getLogger(SslUtil.class);
private static void trustAllHttpsCertificates() throws Exception {
TrustManager[] trustAllCerts = new TrustManager[1];
TrustManager tm = new miTM();
trustAllCerts[0] = tm;
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
}
static class miTM implements TrustManager, X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(X509Certificate[] certs) {
return true;
}
public void checkServerTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
public void checkClientTrusted(X509Certificate[] certs, String authType)
throws CertificateException {
return;
}
}
/**
* @Description:忽略HTTPS请求的SSL证书,必须在openConnection之前调用
* @author:chenbing
* @date 2023/1/4 18:00
*/
@SneakyThrows
public static void ignoreSsl() {
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
logger.info("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
return true;
}
};
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier(hv);
}
}
public String postFormData(String url, MultiValueMap<String, String> map) {
HttpHeaders headers = new HttpHeaders();
//再发送请求之前调用ignoreSsl()方法,忽略掉HTTPS请求的SSL证书
SslUtil.ignoreSsl();
// headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntityString, String>> requests = new HttpEntityString, String>>(map, headers);
String body = restTemplate.postForEntity(url, requests, String.class).getBody();
return body;
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
JAVA
+关注
关注
20文章
3015浏览量
117024 -
开发
+关注
关注
0文章
382浏览量
42263 -
工具
+关注
关注
4文章
319浏览量
28948
发布评论请先 登录
相关推荐
热点推荐
10个关于linux中Squid代理服务器的实用面试问答
不仅是系统管理员和网络管理员时不时会听到“代理服务器”这个词,我们也经常听到。代理服务器已经成为一种企业常态,而且经常会接触到它。它现在也出现在一些小型的学校或者大型跨国公司的自助餐厅里。Squid
发表于 09-28 10:19
Apache代理服务器配置说明
Apache代理服务器 1. 安装apache。 2. 修改\Apache\conf\httpd.conf配置文件, 首先要添加代理服务器模块。找到下面这几行: #LoadModule
发表于 04-29 16:49
•0次下载
代理服务器IP如何使用,这几点需要注意了
作为信息的中转站,伪装自己的真实IP,保障上网安全。那么,如何安全且合理的使用代理IP技术呢? 代理服务器是介于客户端和Web服务器之间的另一台服务器,有了它之后,浏览
恒讯科技分析:代理服务器的类型有哪些?
代理服务器是一台拦截和管理两个设备、网络或协议之间的流量的计算机。代理是充当我们的计算机与我们正在使用的网站和互联网服务之间的中介的网关。它们可以用作防火墙、过滤器、缓存或促进共享网络连接。这是
代理服务器用户名,主要作用是什么?
代理服务器用户名是指用于访问和控制代理服务器的身份验证信息之一。用户名通常由代理服务器的管理员或服务提供商设定,用于确保只有授权用户能够访问和使用代
使用Python构建高效的HTTP代理服务器
构建一个高效的HTTP代理服务器在Python中涉及多个方面,包括性能优化、并发处理、协议支持(HTTP/HTTPS)、错误处理以及日志记录等。
Python中代理服务器的配置与应用
在网络通信中,代理服务器作为一种重要的网络中间件,充当着客户端和目标服务器之间的中间人角色。它能够接收来自客户端的请求,并将这些请求转发给目标服务器,然后将服务器的响应返回给客户端。P
如何使用java代码设置代理服务器?
评论