springboot默认使用的是内置tomcat,默认是只可以开启一个端口,如果开启了https服务,并且想同时可以通过http访问,如何开启第二个端口号呢?网上有很多解决方案,大都是通过new一个TomcatServletWebServerFactory实例对象,这样其实是在springboot内部创建了两个容器,而不是在一个容器内部开启两个端口。

一、创建WebServerFactoryCustomizer自定义策略接口实现类
package com.emily.infrastructure.autoconfigure.tomcat.factory;import com.emily.infrastructure.autoconfigure.tomcat.TomcatProperties;
import org.apache.catalina.connector.Connector;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;/*** @Description : 自定义策略接口,会在tomcat启动之后回调,会被WebServerFactoryCustomizerBeanPostProcessor类回调* @Author :  Emily* @CreateDate :  Created in 2022/6/22 1:37 下午*/
public class TomcatServerCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {/*** 协议*/private static final String SCHEME = "http";/*** 属性配置*/private TomcatProperties properties;public TomcatServerCustomizer(TomcatProperties properties) {this.properties = properties;}@Overridepublic void customize(TomcatServletWebServerFactory factory) {Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");connector.setPort(properties.getPort());connector.setScheme(SCHEME);factory.addAdditionalTomcatConnectors(connector);}
}
二、创建属性配置类TomcatProperties
package com.emily.infrastructure.autoconfigure.tomcat;import org.springframework.boot.context.properties.ConfigurationProperties;/*** @author Emily* @description: http属性配置文件* @create: 2020/06/28*/
@ConfigurationProperties(prefix = "server.http")
public class TomcatProperties {/*** 是否开启http服务*/private boolean enabled;/*** 端口号*/private int port = 8080;public int getPort() {return port;}public void setPort(int port) {this.port = port;}public boolean isEnabled() {return enabled;}public void setEnabled(boolean enabled) {this.enabled = enabled;}
}
三、创建配置类TomcatAutoConfiguration
package com.emily.infrastructure.autoconfigure.tomcat;import com.emily.infrastructure.autoconfigure.tomcat.factory.TomcatServerCustomizer;
import com.emily.infrastructure.logger.LoggerFactory;
import org.slf4j.Logger;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;/*** HTTP自动跳转HTTPS自动化配置类* 生成证书命令:* keytool -genkey -alias michaelSpica  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore /Users/Emily/Documents/IDE/workplace/security/keystore.p12 -validity 3650 -dname "CN=localhost, OU=localhost, O=localhost, L=SH, ST=SH, C=CN"** @author Emily*/
@AutoConfiguration
@EnableConfigurationProperties(TomcatProperties.class)
@ConditionalOnProperty(prefix = "server.http", name = "enabled", havingValue = "true", matchIfMissing = false)
public class TomcatAutoConfiguration implements InitializingBean, DisposableBean {private static final Logger logger = LoggerFactory.getLogger(TomcatAutoConfiguration.class);@Beanpublic TomcatServerCustomizer tomcatServerCustomizer(TomcatProperties properties) {return new TomcatServerCustomizer(properties);}@Overridepublic void destroy() throws Exception {logger.info("<== 【销毁--自动化配置】----自定义tomcat服务器");}@Overridepublic void afterPropertiesSet() throws Exception {logger.info("==> 【初始化--自动化配置】----自定义tomcat服务器");}
}

如需配置自动化配置可在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中配置上配置类即可(springboot2.7.0)

通过上述三个简单类完美实现在同一个容器内开启第二个端口,启动信息如下:

 o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 9000 (https) 9001 (http) with context path ''

示例GitHub参考:https://github.com/mingyang66/spring-parent

springboot内嵌tomcat如何优雅开启http端口相关推荐

  1. Springboot内嵌tomcat

    Springboot内嵌tomcat 前言 一.依赖引入starter-web 二.源码截图 tomcat 如何内嵌 三.springboot 如何启动tomcat 前言 一.依赖引入starter- ...

  2. 指定SpringBoot内嵌Tomcat的版本,修复(CVE-2021-42340)漏洞

    1.Tomcat漏洞 近日,Apache Tomcat 发布安全更新,更新了一处拒绝服务漏洞(CVE-2021-42340).攻击者可以通过该漏洞进行拒绝服务攻击.建议广大用户及时升级至最新版本. 1 ...

  3. 总结:SpringBoot内嵌Tomcat原理

    一.介绍 一般我们启动web服务都需要单独的去安装tomcat,而Springboot自身却直接整合了Tomcat,什么原理呢? 二.原理 SpringBoot应用只需要引入spring-boot-s ...

  4. springboot内嵌tomcat调优

    在springboot-configuration-metadata.json文件下面,有很多属于springboot得喷子hi属性,以下为tomcat的默认配置属性: server.tomcat.a ...

  5. tomcat start 无法启动_解密Springboot内嵌Tomcat

    Springboot简介 相信大多数开发者对Springboot比较熟悉了,它能够快速地创建一个spring应用,能够完全摒弃XML的配置方式,并且内嵌了Tomcat.Jetty这样的Servlet容 ...

  6. 解密Springboot内嵌Tomcat

    Springboot简介 相信大多数开发者对Springboot比较熟悉了,它能够快速地创建一个spring应用,能够完全摒弃XML的配置方式,并且内嵌了Tomcat.Jetty这样的Servlet容 ...

  7. SpringBoot内嵌Tomcat原理

    1.SpringBoot对SpringMVC的支持 对于一个 SpringBoot web 工程来说,一个主要的依赖标志就是有 spring-boot-starter-web 这个 starter , ...

  8. springboot内嵌Tomcat启动失败

    问题描述 开发需求期间引入友军的二方包,导致服务启动失败,失败日志如下 java.lang.reflect.InvocationTargetExceptionat sun.reflect.Native ...

  9. springboot内嵌tomcat的jar包启动流程

    白茶清欢无别事,我在等风也等你.苦酒折柳今相离,无风无月也无你 调用SpringApplication.run org.springframework.boot.SpringApplication#r ...

  10. springboot内置tomcat,会和Oracle端口冲突,所以需要配置新的端口号

    eg: 在src\main\resources添加application.properties配置 server.port=8888 转载于:https://www.cnblogs.com/longN ...

最新文章

  1. 大幅提高生产力:你需要了解的十大Jupyter Lab插件
  2. Kubernetes Pod的生命周期(Lifecycle)
  3. Change Fiori launchpad logo
  4. oracle fnd file.log,OracleEBSWIP模块DebugLog收集方法
  5. Matlab如何实现区间优化
  6. 运营商取消不限量套餐 网友:这是变相涨价
  7. 知行合一!如何做好项目经理?
  8. centos mysql5.6.35_centos6.8 mysql 5.6.35 glibc安装
  9. android studio outline,AndroidStudio常用设置
  10. 安卓3d游戏开发引擎_鲁大师安卓3D引擎更新,跑分测试精准度再升级
  11. Http协议中常用字段总结(不定时完善中)
  12. android计算器表格布局,Android 计算器UI-TableLayout
  13. 工作计划表怎么做?30份Excel工作计划表模板,职场人必备,可套用
  14. 最短路算法——Floyd-Warshall
  15. 考研408院校合集以及学科评估
  16. 国内优秀开源镜像站汇总
  17. Unity—英雄无敌(前方高能)
  18. 腾讯低代码平台实战体验
  19. 死亡时间推断MATLAB,AGU 本周精选文章:火星陨石坑;气候敏感性;水资源压力;洪水灾害建模...
  20. thinkphp Malformed UTF-8 characters, possibly incorrectly encoded报错解决方案

热门文章

  1. 前端笔记:飞机航线图
  2. 【原创smarty仿淘宝商品图片轮播+放大镜效果】
  3. IP协议(IP协议报头、MTU、网段划分、NAT技术、路由的工作过程)
  4. XCode7报 App Transport Security has blocked a cleartext HTTP (http://) resource load since it is inse
  5. 大话西游中的这些经典元素,注意到没?
  6. Android NDK不得不说的秘密
  7. 100句励志名句让你在困境中绝地求生
  8. Drupal项目实战-公司订餐系统
  9. Jzoj5444【NOIP2017提高A组冲刺11.2】救赎
  10. 极简图床 + 阿里云OSS 做图片外链