Spring Boot 核心配置解析:server.port 与 server.http.port 区别与实战
在 Spring Boot 应用开发中,端口配置是最基础也最关键的配置之一,直接影响应用的访问方式。
server.port和server.http.port是两个容易混淆的端口配置项,前者是 Spring Boot 原生核心配置,后者则用于特定场景下的多端口支持(如 HTTP 与 HTTPS 共存)。本文将从核心定义、使用场景、实战配置到常见误区,全面解析这两个配置项。
一、核心概念:两个端口配置的本质区别
1.1 server.port:Spring Boot 原生核心端口
server.port 是 Spring Boot 内置的核心配置项,用于指定应用的默认服务端口,也是大多数场景下唯一需要配置的端口。
核心特性:
- 默认值:未配置时,HTTP 服务默认使用
8080端口(可通过spring-boot-starter-web自动启用);若配置了 HTTPS 证书(如server.ssl.key-store),则该端口自动作为 HTTPS 端口 - 作用范围:全局唯一,直接绑定应用的主要服务端口,所有未特殊配置的请求(HTTP/HTTPS)都会通过该端口接收
- 配置方式:支持在
application.yml/application.properties中直接配置,无需额外代码
1.2 server.http.port:HTTPS 场景下的 HTTP 备用端口
server.http.port 并非 Spring Boot 原生默认配置,而是开发者在「同时支持 HTTP 和 HTTPS」场景下自定义的配置项。
核心特性:
- 使用前提:仅当应用已配置 HTTPS(通过
server.ssl.*系列配置),需要额外开放 HTTP 端口(如80端口)用于接收 HTTP 请求,并自动重定向到 HTTPS 端口时使用 - 核心作用:作为 HTTP 协议的监听端口,通常用于「HTTP 转 HTTPS」的跳转,而非独立提供 HTTP 服务
- 配置方式:需手动在配置文件中定义该属性,再通过自定义配置类绑定端口并启用 HTTP 连接器
1.3 核心区别对比表
| 配置项 | 本质属性 | 默认值 | 核心作用 | 依赖条件 |
|---|---|---|---|---|
server.port | Spring Boot 原生配置 | 8080 | 指定应用默认服务端口(HTTP/HTTPS 共用) | 无(spring-boot-starter-web 启用后生效) |
server.http.port | 自定义扩展配置 | 无 | HTTPS 场景下的 HTTP 备用端口(用于重定向) | 需配置 HTTPS 证书 + 自定义配置类 |
二、基础用法:单个端口配置(HTTP/HTTPS)
2.1 仅启用 HTTP 服务(默认场景)
若应用只需提供 HTTP 服务,仅需配置 server.port 即可,这是最常见的场景。
配置方式(application.yml)
server:
port: 8081 # 指定 HTTP 服务端口为 8081(默认 8080)
配置方式(application.properties)
server.port=8081
效果:应用启动后,可通过 http://localhost:8081 访问服务,无需额外配置。
2.2 仅启用 HTTPS 服务
若应用需要通过 HTTPS 提供安全服务,需先准备 SSL 证书,再配置 server.ssl.* 系列属性,此时 server.port 自动作为 HTTPS 端口。
步骤 1:生成自签名 SSL 证书(示例)
通过 JDK 自带的 keytool 命令生成证书文件:
keytool -genkeypair -alias springboot-ssl -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore springboot-ssl.p12 -validity 3650
执行命令后按提示输入密码(如 123456)、组织信息等,生成 springboot-ssl.p12 证书文件。
步骤 2:配置 HTTPS(application.yml)
server:
port: 443 # HTTPS 默认端口(推荐使用,无需端口号即可访问)
ssl:
key-store: classpath:ssl/springboot-ssl.p12 # 证书路径
key-store-password: 123456 # 证书密码(与生成时一致)
key-store-type: PKCS12 # 证书格式(PKCS12 是标准格式)
key-alias: springboot-ssl # 证书别名(与生成时一致)
效果:应用启动后,仅支持 https://localhost 访问(443 端口可省略),直接访问 http://localhost 会提示「无法访问」(无 HTTP 服务监听)。
三、进阶实战:同时启用 HTTP 和 HTTPS(HTTP 自动跳转 HTTPS)
实际生产场景中,通常需要同时支持 HTTP(80 端口)和 HTTPS(443 端口),并将所有 HTTP 请求自动重定向到 HTTPS,此时需用到 server.http.port 配置 + 配置类实现。
3.1 核心思路
- 配置
server.port作为 HTTPS 端口(如 443) - 自定义
server.http.port作为 HTTP 端口(如 80) - 通过
ServletWebServerFactory配置类,同时启用 HTTP 和 HTTPS 两个连接器 - 实现 HTTP 请求到 HTTPS 的自动重定向
3.2 完整配置步骤
步骤 1:配置文件(application.yml)
server:
port: 443 # HTTPS 端口(默认 443,可省略)
http:
port: 80 # 自定义 HTTP 端口(需配置类绑定)
ssl:
key-store: classpath:ssl/springboot-ssl.p12
key-store-password: 123456
key-store-type: PKCS12
key-alias: springboot-ssl
步骤 2:自定义配置类(启用双端口 + 重定向)
Spring Boot 2.x 及以上版本通过 ServletWebServerFactory 配置双端口:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.apache.catalina.connector.Connector;
@Configuration
public class HttpHttpsConfig {
// 读取自定义的 HTTP 端口(server.http.port)
@Value("${server.http.port:80}")
private int httpPort;
// 读取 HTTPS 端口(server.port)
@Value("${server.port:443}")
private int httpsPort;
/**
* 配置 Servlet 容器工厂,同时启用 HTTP 和 HTTPS 连接器
*/
@Bean
public ServletWebServerFactory servletWebServerFactory() {
// 使用 Tomcat 容器(Spring Boot 默认)
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(org.apache.catalina.Context context) {
// 配置 HTTP 到 HTTPS 的重定向规则
org.apache.catalina.valves.rewrite.RewriteValve valve = new org.apache.catalina.valves.rewrite.RewriteValve();
valve.setConfiguration("RewriteCond %{SERVER_PORT} = " + httpPort + "\nRewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]");
context.getPipeline().addValve(valve);
}
};
// 添加 HTTP 连接器(监听 server.http.port 端口)
factory.addAdditionalTomcatConnectors(createHttpConnector());
return factory;
}
/**
* 创建 HTTP 连接器
*/
private Connector createHttpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http"); // 协议类型
connector.setPort(httpPort); // HTTP 端口
connector.setSecure(false); // 非安全连接
// 将 HTTP 请求转发到 HTTPS 端口(关键配置)
connector.setRedirectPort(httpsPort);
return connector;
}
}
3.3 效果验证
- 启动应用后,系统同时监听 80 端口(HTTP)和 443 端口(HTTPS)
- 访问
http://localhost(80 端口),会自动重定向到https://localhost(301 永久重定向) - 直接访问
https://localhost可正常使用 HTTPS 服务
3.4 非 Tomcat 容器适配(可选)
若应用使用 Jetty 或 Undertow 容器(而非默认的 Tomcat),需调整配置类:
Undertow 容器配置示例:
@Bean
public ServletWebServerFactory servletWebServerFactory() {
UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();
// 配置 HTTPS 端口(默认已通过 server.port 绑定)
// 添加 HTTP 监听
factory.addBuilderCustomizers(builder -> {
builder.addHttpListener(httpPort, "0.0.0.0") // 监听 HTTP 端口
.setRedirectPort(httpsPort); // 重定向到 HTTPS 端口
});
return factory;
}
四、常见误区与注意事项
4.1 误区 1:单独配置 server.http.port 即可启用 HTTP 服务
错误认知:以为配置 server.http.port=80 后,应用会自动监听 80 端口提供 HTTP 服务。
正确结论:server.http.port 是自定义配置项,Spring Boot 不直接识别,必须通过配置类绑定并添加连接器,否则配置无效。
4.2 误区 2:启用 HTTPS 后,server.port 仍支持 HTTP 访问
错误认知:配置 HTTPS 后,server.port 同时支持 HTTP 和 HTTPS。
正确结论:配置 server.ssl.* 后,server.port 仅作为 HTTPS 端口,HTTP 服务默认关闭,需手动配置 HTTP 连接器才能支持。
4.3 注意事项 1:端口冲突问题
- 确保
server.port和server.http.port不重复(如不能同时设为 8080) - 避免使用系统保留端口(如 1-1023 端口,Linux/Mac 下需 root 权限才能使用 80/443 端口)
4.4 注意事项 2:生产环境的安全配置
- 禁止使用自签名证书(仅用于开发测试),生产环境需使用 CA 机构颁发的正式 SSL 证书
- 建议禁用 HTTP 服务的直接访问,仅保留「HTTP 转 HTTPS」的重定向功能
- 配置 SSL 协议版本限制,提升安全性:
server:
ssl:
enabled-protocols: TLSv1.2,TLSv1.3 # 仅启用安全的 TLS 版本
4.5 注意事项 3:Spring Boot 版本差异
- Spring Boot 2.x 及以上:使用
ServletWebServerFactory配置双端口 - Spring Boot 1.x:使用
EmbeddedServletContainerCustomizer配置(已过时,建议升级版本)
五、总结与最佳实践
5.1 核心总结
server.port:Spring Boot 原生端口配置,默认启用 HTTP 服务,配置 SSL 后转为 HTTPS 端口server.http.port:自定义扩展配置,仅用于 HTTPS 场景下的 HTTP 备用端口,需通过配置类绑定启用- 双端口场景:核心是「启用双连接器 + 重定向」,本质是通过容器配置实现多端口监听
5.2 最佳实践
- 开发环境:仅配置
server.port=8080,无需 HTTPS,简化开发流程 - 测试环境:使用自签名证书配置 HTTPS,同时启用 HTTP 重定向(
server.http.port=8081),模拟生产环境 - 生产环境:
- 配置
server.port=443(HTTPS 默认端口)和server.http.port=80(HTTP 重定向) - 使用 CA 正式证书,禁用不安全的 TLS 版本
- 通过防火墙限制端口访问,仅开放 80 和 443 端口
- 配置
通过本文的解析,相信开发者能清晰区分 server.port 和 server.http.port 的用法,并根据实际场景灵活配置端口策略,兼顾服务的可用性与安全性。
更多推荐
所有评论(0)