You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot API配置HTTPS后前端请求失败求助

问题分析与解决方案

核心原因

前端请求失败本质是浏览器不认可自签名SSL证书——Postman可手动跳过证书验证,但浏览器会严格校验证书是否在信任根列表中;同时你的Spring Boot配置存在SSL端口重复定义的问题,可能导致实际服务监听端口与预期不符,进一步引发请求异常。

步骤1:修复Spring Boot SSL配置冲突

你的application.properties和ServletWebServerFactory Bean都配置了SSL,会导致Tomcat启动多个HTTPS端口(5001和443),容易混淆前端请求目标端口。建议二选一统一配置:

方案A:保留application.properties配置,移除代码中的HTTPS Connector

删除SSOApplication里的HTTPS Connector配置块,仅保留HTTP转HTTPS的重定向逻辑(可选):

@Bean
public ServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();

    // 仅保留HTTP转HTTPS的重定向(可选)
    Connector httpConnector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    httpConnector.setScheme("http");
    httpConnector.setPort(5002);
    httpConnector.setSecure(false);
    // 自动将HTTP请求重定向到HTTPS端口5001
    httpConnector.setRedirectPort(5001);
    tomcat.addAdditionalTomcatConnectors(httpConnector);

    return tomcat;
}

此时服务HTTPS端口为application.properties中定义的5001,前端请求需指向https://your-domain:5001。

方案B:用代码统一配置,清空application.properties的SSL项

若要完全通过代码配置,删除application.properties中所有server.ssl开头的配置,同时修正证书路径(避免打包后路径失效):

@Bean
public ServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();

    // HTTP Connector
    Connector httpConnector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    httpConnector.setScheme("http");
    httpConnector.setPort(5002);
    httpConnector.setSecure(false);
    httpConnector.setRedirectPort(443);
    tomcat.addAdditionalTomcatConnectors(httpConnector);

    // HTTPS Connector
    Connector httpsConnector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    httpsConnector.setScheme("https");
    httpsConnector.setSecure(true);
    httpsConnector.setPort(443);
    // 通过类加载器获取证书,适配打包后的路径
    httpsConnector.setAttribute("keystoreFile", Thread.currentThread().getContextClassLoader().getResource("https-example.jks").getPath());
    httpsConnector.setAttribute("keystorePass", "xxxx");
    httpsConnector.setAttribute("keyAlias", "https-example");
    tomcat.addAdditionalTomcatConnectors(httpsConnector);

    return tomcat;
}

此时HTTPS端口为443,前端请求需指向https://your-domain(默认443端口可省略)。

步骤2:让浏览器信任自签名证书

方法1:将证书导入浏览器信任列表(推荐)

  1. 从JKS文件导出PEM格式证书:
    keytool -export -alias https-example -keystore https-example.jks -rfc -file https-example.crt
    
  2. 以Chrome为例,进入设置 > 隐私和安全 > 安全 > 管理证书,切换到受信任的根证书颁发机构标签,点击导入,选择导出的https-example.crt文件完成导入。

方法2:开发环境临时绕过(仅用于测试,禁止生产使用)

打开Chrome浏览器输入chrome://flags/#allow-insecure-localhost,将选项设置为Enabled后重启浏览器,可临时信任localhost的自签名证书。

步骤3:配置跨域(CORS)

如果前端与API不在同一域名/端口,需添加CORS配置避免跨域拦截:

@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        // 开发环境可设为*,生产需指定具体前端域名
        config.addAllowedOriginPattern("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        config.setAllowCredentials(true);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 19:30:24