@Bean

public ClientHttpRequestFactory simpleClientHttpRequestFactory() {

SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();

factory.setReadTimeout(5000);

factory.setConnectTimeout(15000);

return factory;

}

}

RestTemplate封装很好,这个配置操作http请求基本够用了,但是却不支持https。

可能是对于spring封装的代码有信心,就想找找有没有替代的类,我首先想到的是ClientHttpRequestFactory接口的实现类。

果然,在SimpleClientHttpRequestFactory类下面找到了一个子类SkipSslVerificationHttpRequestFactory,可惜这个类不对外暴露,只能同包引用。

ClientHttpRequestFactory

这个类在spring-boot-actuator-autoconfigure的jar包中,如果项目中没有引用的话可以直接复制我下面贴的代码,有的话可以直接在自己代码中找到这个类

/*

  • Copyright 2012-2017 the original author or authors.

  • Licensed under the Apache License, Version 2.0 (the “License”);

  • you may not use this file except in compliance with the License.

  • You may obtain a copy of the License at

  •  http://www.apache.org/licenses/LICENSE-2.0
    
  • Unless required by applicable law or agreed to in writing, software

  • distributed under the License is distributed on an “AS IS” BASIS,

  • WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  • See the License for the specific language governing permissions and

  • limitations under the License.

*/

package org.springframework.boot.actuate.autoconfigure.cloudfoundry.servlet;

import java.io.IOException;

import java.net.HttpURLConnection;

import java.security.SecureRandom;

import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;

import javax.net.ssl.HttpsURLConnection;

import javax.net.ssl.SSLContext;

import javax.net.ssl.SSLSession;

import javax.net.ssl.SSLSocketFactory;

import javax.net.ssl.TrustManager;

import javax.net.ssl.X509TrustManager;

import org.springframework.http.client.SimpleClientHttpRequestFactory;

/**

  • {@link SimpleClientHttpRequestFactory} that skips SSL certificate verification.

  • @author Madhura Bhave

*/

class SkipSslVerificationHttpRequestFactory extends SimpleClientHttpRequestFactory {

@Override

protected void prepareConnection(HttpURLConnection connection, String httpMethod)

throws IOException {

if (connection instanceof HttpsURLConnection) {

prepareHttpsConnection((HttpsURLConnection) connection);

}

super.prepareConnection(connection, httpMethod);

}

private void prepareHttpsConnection(HttpsURLConnection connection) {

connection.setHostnameVerifier(new SkipHostnameVerifier());

try {

connection.setSSLSocketFactory(createSslSocketFactory());

}

catch (Exception ex) {

// Ignore

}

}

private SSLSocketFactory createSslSocketFactory() throws Exception {

SSLContext context = SSLContext.getInstance(“TLS”);

context.init(null, new TrustManager[] { new SkipX509TrustManager() },

new SecureRandom());

return context.getSocketFactory();

}

private class SkipHostnameVerifier implements HostnameVerifier {

@Override

public boolean verify(String s, SSLSession sslSession) {

return true;

}

}

private static class SkipX509TrustManager implements X509TrustManager {

@Override

public X509Certificate[] getAcceptedIssuers() {

return new X509Certificate[0];

}

@Override

public void checkClientTrusted(X509Certificate[] chain, String authType) {

}

@Override

public void checkServerTrusted(X509Certificate[] chain, String authType) {

}

}

}

这个类代码很简洁,没有多余依赖,主要做了ssl的单项认证,同时支持http和https,下接下来就不用说了,复制一份到本地包,我这里起名SslClientHttpRequestFactory,然后替换掉之前的SimpleClientHttpRequestFactory。

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.http.client.ClientHttpRequestFactory;

import org.springframework.web.client.RestTemplate;

@Configuration

public class RestTemplateConfig {

@Bean

public RestTemplate restTemplate(ClientHttpRequestFactory factory) {

return new RestTemplate(factory);

}

@Bean

public ClientHttpRequestFactory simpleClientHttpRequestFactory() {

SslClientHttpRequestFactory factory = new SslClientHttpRequestFactory();

factory.setReadTimeout(5000);

factory.setConnectTimeout(15000);

return factory;

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐