You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何修改Spring ProxyExchange中使用的RestTemplate?(MVC环境)

当然可以实现!这里给你一套针对Spring MVC环境下修改ProxyExchange默认RestTemplate的方案

首先得明确:ProxyExchange在Spring MVC场景下默认依赖RestTemplate来处理转发请求,所以我们只需要替换掉默认的RestTemplate为忽略SSL证书的版本,再让ProxyExchange用上它就行。而且一定要注意只在开发环境生效,别带到生产环境!

步骤1:编写忽略SSL证书的RestTemplate配置

先写一个自定义的ClientHttpRequestFactory,用来绕过SSL证书验证:

import org.springframework.http.client.SimpleClientHttpRequestFactory;
import javax.net.ssl.*;
import java.security.cert.X509Certificate;

public class SslIgnoringClientHttpRequestFactory extends SimpleClientHttpRequestFactory {

    @Override
    protected void prepareConnection(HttpURLConnection connection, String httpMethod) {
        try {
            if (connection instanceof HttpsURLConnection) {
                HttpsURLConnection httpsConn = (HttpsURLConnection) connection;
                // 创建信任所有证书的SSL上下文
                SSLContext sslContext = SSLContext.getInstance("TLS");
                sslContext.init(null, new TrustManager[]{new X509TrustManager() {
                    @Override
                    public void checkClientTrusted(X509Certificate[] chain, String authType) {}

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

                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return new X509Certificate[0];
                    }
                }}, new java.security.SecureRandom());
                
                httpsConn.setSSLSocketFactory(sslContext.getSocketFactory());
                // 跳过主机名验证
                httpsConn.setHostnameVerifier((hostname, session) -> true);
            }
            super.prepareConnection(connection, httpMethod);
        } catch (Exception e) {
            throw new RuntimeException("Failed to prepare SSL connection", e);
        }
    }
}

接着创建配置类,生成这个自定义的RestTemplate,并且只在开发环境激活:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.web.client.RestTemplate;

@Configuration
@Profile("dev") // 仅开发环境生效,生产环境自动禁用
public class DevProxyRestTemplateConfig {

    @Bean
    public RestTemplate sslIgnoringRestTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setRequestFactory(new SslIgnoringClientHttpRequestFactory());
        return restTemplate;
    }
}

步骤2:让ProxyExchange使用自定义的RestTemplate

在Spring MVC中,ProxyExchange默认会自动注入容器中的RestTemplate。不过为了确保它能精准用上我们的自定义实例,可以额外配置一个ProxyExchange的Bean:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.web.servlet.function.ProxyExchange;

@Configuration
@Profile("dev")
public class DevProxyExchangeConfig {

    // 注入我们刚才定义的忽略SSL的RestTemplate
    @Bean
    public ProxyExchange<?> proxyExchange(RestTemplate sslIgnoringRestTemplate) {
        return new ProxyExchange<>(sslIgnoringRestTemplate);
    }
}

最后验证一下

在你的控制器中正常使用ProxyExchange就行,比如:

@GetMapping("/proxy/**")
public ResponseEntity<?> proxyRequest(ProxyExchange<?> proxy) throws Exception {
    // 这里的proxy已经在用我们的忽略证书的RestTemplate了
    return proxy.uri("/target-api/**").forward();
}

这样配置后,开发环境下通过ProxyExchange转发请求时,就会自动忽略目标服务的SSL证书验证了。再次提醒:千万不要在生产环境启用这个配置,会带来严重的安全风险!

内容的提问来源于stack exchange,提问作者Nati

火山引擎 最新活动