分两个类
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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249
| import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.ResponseErrorHandler;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Map;
/**
* restTemplateUtils 高性能请求http https
* 时间单位 毫秒
*/
@Slf4j
public class RestTemplateUtilTwo {
// 默认时间五秒,不重试。
private final static int CONNEC_TIMEOUT = 5000;
private final static int READ_TIMEOUT = 5000;
private final static int RETRY_COUNT = 1;
/**
* https 请求 GET
* @param url 地址
* @param connecTimeout 连接时间 毫秒
* @param readTimeout 读取时间 毫秒
* @param retryCount 重试机制
* @return String 类型
*/
public static String getHttp(String url, int connecTimeout, int readTimeout, int retryCount) {
RestTemplate restTemplate = simpeClient(url, connecTimeout, readTimeout);
String result = null; // 返回值类型;
for (int i = 1; i <= retryCount; i++) {
try {
result = restTemplate.getForObject(url, String.class);
return result;
} catch (RestClientException e) {
log.error("-----------开始-----------重试count: " + i);
e.printStackTrace();
}
}
return null;
}
/**
* https 请求 GET
* @param url 地址
* @return String 类型
*/
public static String getHttp(String url) {
RestTemplate restTemplate = simpeClient(url, CONNEC_TIMEOUT, READ_TIMEOUT);
String result = null; // 返回值类型;
for (int i = 1; i <= RETRY_COUNT; i++) {
try {
result = restTemplate.getForObject(url, String.class);
return result;
} catch (RestClientException e) {
log.error("-----------开始-----------重试count: " + i);
e.printStackTrace();
}
}
return null;
}
/**
* http 请求 post
* @param url 地址
* @param params 参数
* @param headersMap header
* @param connecTimeout 连接时间
* @param readTimeout 读取时间`
* @param retryCount 重试机制
* @return String 类型
*/
public static String postHttp(String url, JSONObject params, Map headersMap, int connecTimeout, int readTimeout, int retryCount) {
RestTemplate restTemplate = simpeClient(url, connecTimeout, readTimeout);
// 设置·header信息
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAll(headersMap);
HttpEntity<JSONObject> requestEntity = new HttpEntity<JSONObject>(params, requestHeaders); // josn utf-8 格式
String result = null; // 返回值类型;
for (int i = 1; i <= retryCount; i++) {
try {
result = restTemplate.postForObject(url, requestEntity, String.class);
return result;
} catch (RestClientException e) {
log.error("-----------开始-----------重试count: " + i);
e.printStackTrace();
}
}
return null;
}
/**
* http 请求 post
* @param url 地址
* @param params 参数
* @param headersMap header
* @return String 类型
*/
public static String postHttp(String url, JSONObject params, Map headersMap) {
RestTemplate restTemplate = simpeClient(url, CONNEC_TIMEOUT, READ_TIMEOUT);
// 设置·header信息
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAll(headersMap);
HttpEntity<JSONObject> requestEntity = new HttpEntity<JSONObject>(params, requestHeaders); // josn utf-8 格式
String result = null; // 返回值类型;
for (int i = 1; i <= RETRY_COUNT; i++) {
try {
result = restTemplate.postForObject(url, requestEntity, String.class);
return result;
} catch (RestClientException e) {
log.error("-----------开始-----------重试count: " + i);
e.printStackTrace();
}
}
return null;
}
/**
* 加密参数类型请求 application/x-www-form-urlencoded
* MultiValueMap<String, Object>
* 采用 HttpEntity<MultiValueMap<String, Object>> 构造
* http 请求 post
*
* @param url 地址
* @param postParameters 参数
* @param headersMap header
* @param connecTimeout 连接时间
* @param readTimeout 读取时间
* @param retryCount 重试机制
* @return String 类型
*/
public static String postHttpEncryption(String url, MultiValueMap<String, Object> postParameters, Map headersMap, int connecTimeout, int readTimeout, int retryCount) {
RestTemplate restTemplate = simpeClient(url, connecTimeout, readTimeout);
// 设置·header信息
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAll(headersMap);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(postParameters, requestHeaders);
String result = null; // 返回值类型;
for (int i = 1; i <= retryCount; i++) {
try {
result = restTemplate.postForObject(url, requestEntity, String.class);
return result;
} catch (RestClientException e) {
log.error("-----------开始-----------重试count: " + i);
e.printStackTrace();
}
}
return null;
}
/**
* 加密参数类型请求 application/x-www-form-urlencoded
* MultiValueMap<String, Object>
* 采用 HttpEntity<MultiValueMap<String, Object>> 构造
* http 请求 post
* @param url 地址
* @param postParameters 参数
* @param headersMap header
* @return String 类型
*/
public static String postHttpEncryption(String url, MultiValueMap<String, Object> postParameters, Map headersMap) {
RestTemplate restTemplate = simpeClient(url, CONNEC_TIMEOUT, READ_TIMEOUT);
// 设置·header信息
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAll(headersMap);
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(postParameters, requestHeaders);
String result = null; // 返回值类型;
for (int i = 1; i <= RETRY_COUNT; i++) {
try {
result = restTemplate.postForObject(url, requestEntity, String.class);
return result;
} catch (RestClientException e) {
log.error("-----------开始-----------重试count: " + i);
e.printStackTrace();
}
}
return null;
}
private static RestTemplate simpeClient(String url, int connecTimeout, int readTimeout) {
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setConnectTimeout(connecTimeout);
requestFactory.setReadTimeout(readTimeout);
RestTemplate restTemplate = new RestTemplate(requestFactory);
restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); // 设置编码集
restTemplate.setErrorHandler(new DefaultResponseErrorHandler()); //error处理
if (url.contains("https")){
restTemplate.setRequestFactory(new HttpsClientRequestFactory()); // 绕过https
}
return restTemplate;
}
/**
* @ClassName: DefaultResponseErrorHandler
* @Description: TODO
* @author:
* @date: 2
*/
private static class DefaultResponseErrorHandler implements ResponseErrorHandler {
/**
* 对response进行判断,如果是异常情况,返回true
*/
@Override
public boolean hasError(ClientHttpResponse response) throws IOException {
return response.getStatusCode().value() != HttpServletResponse.SC_OK;
}
/**
* 异常情况时的处理方法
*/
@Override
public void handleError(ClientHttpResponse response) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(response.getBody()));
StringBuilder sb = new StringBuilder();
String str = null;
while ((str = br.readLine()) != null) {
sb.append(str);
}
try {
throw new Exception(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
} |
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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| import org.springframework.http.client.SimpleClientHttpRequestFactory;
import javax.net.ssl.*;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.Socket;
import java.security.cert.X509Certificate;
/**
* Created by huangquanwei on 2019/6/1 10:30
* Https 绕过
*/
public class HttpsClientRequestFactory extends SimpleClientHttpRequestFactory {
@Override
protected void prepareConnection(HttpURLConnection connection, String httpMethod) {
try {
if (!(connection instanceof HttpsURLConnection)) {
throw new RuntimeException("An instance of HttpsURLConnection is expected");
}
HttpsURLConnection httpsConnection = (HttpsURLConnection) connection;
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
@Override
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
}
};
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
httpsConnection.setSSLSocketFactory(new MyCustomSSLSocketFactory(sslContext.getSocketFactory()));
httpsConnection.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
});
super.prepareConnection(httpsConnection, httpMethod);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* We need to invoke sslSocket.setEnabledProtocols(new String[] {"SSLv3"});
* see http://www.oracle.com/technetwork/java/javase/documentation/cve-2014-3566-2342133.html (Java 8 section)
*/
// SSLSocketFactory用于创建 SSLSockets
private static class MyCustomSSLSocketFactory extends SSLSocketFactory {
private final SSLSocketFactory delegate;
public MyCustomSSLSocketFactory(SSLSocketFactory delegate) {
this.delegate = delegate;
}
// 返回默认启用的密码套件。除非一个列表启用,对SSL连接的握手会使用这些密码套件。
// 这些默认的服务的最低质量要求保密保护和服务器身份验证
@Override
public String[] getDefaultCipherSuites() {
return delegate.getDefaultCipherSuites();
}
// 返回的密码套件可用于SSL连接启用的名字
@Override
public String[] getSupportedCipherSuites() {
return delegate.getSupportedCipherSuites();
}
@Override
public Socket createSocket(final Socket socket, final String host, final int port,
final boolean autoClose) throws IOException {
final Socket underlyingSocket = delegate.createSocket(socket, host, port, autoClose);
return overrideProtocol(underlyingSocket);
}
@Override
public Socket createSocket(final String host, final int port) throws IOException {
final Socket underlyingSocket = delegate.createSocket(host, port);
return overrideProtocol(underlyingSocket);
}
@Override
public Socket createSocket(final String host, final int port, final InetAddress localAddress,
final int localPort) throws
IOException {
final Socket underlyingSocket = delegate.createSocket(host, port, localAddress, localPort);
return overrideProtocol(underlyingSocket);
}
@Override
public Socket createSocket(final InetAddress host, final int port) throws IOException {
final Socket underlyingSocket = delegate.createSocket(host, port);
return overrideProtocol(underlyingSocket);
}
@Override
public Socket createSocket(final InetAddress host, final int port, final InetAddress localAddress,
final int localPort) throws
IOException {
final Socket underlyingSocket = delegate.createSocket(host, port, localAddress, localPort);
return overrideProtocol(underlyingSocket);
}
private Socket overrideProtocol(final Socket socket) {
if (!(socket instanceof SSLSocket)) {
throw new RuntimeException("An instance of SSLSocket is expected");
}
((SSLSocket) socket).setEnabledProtocols(new String[]{"TLSv1"});
return socket;
}
}
} |