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:将证书导入浏览器信任列表(推荐)
- 从JKS文件导出PEM格式证书:
keytool -export -alias https-example -keystore https-example.jks -rfc -file https-example.crt - 以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
相关产品推荐
相关产品推荐

