Springboot同时支持http和https访问

springboot默认是http的

一、支持https访问

需要生成证书,并配置到项目中。

1、证书

如果公司提供,则直接使用公司提供的证书;

如果公司没有提供,也可自己使用Java自带的命令keytool来生成:

(1)执行cmd命令

windows下cmd打开命令黑窗口,输入以下命令(直接复制即可)

复制代码
keytool -genkey -alias tomcat  -storetype PKCS12 -keyalg RSA -keysize 2048  -keystore keystore.p12 -validity 3650

有些参数是可以自定义的:

复制代码
1. -storetype 指定密钥仓库类型 
2. -keyalg 生证书的算法名称,RSA是一种非对称加密算法 
3. -keysize 证书大小 
4. -keystore 生成的证书文件的存储路径 
5. -validity 证书的有效期
(2)按照提示输入信息

输入keytool命令后回车会弹框提示输入password、first name、last name、地址等信息。

(3)最后会自动生成一个文件

如我

把这个文件复制出来放到:

  • 可以放在项目的根目录下,即和pom文件同级的目录
  • 也可放置在src/main/resources目录下

我选择了放在src/main/resources下。

2、在配置文件中配置支持https所需信息
复制代码
# 支持https访问
# https访问的端口号
server.port=8443
# 证书的路径,根据证书放置位置不同,写法不同
# 如果证书放在根目录下,此处只需要写证书的名字即可,但项目打包部署时提示证书找不到,故建议放在resources文件夹下
# 如果证书放在 src/main/resources 下,则需写 classpath:keystore/server.keystore
server.ssl.key-store=classpath:keystore/server.keystore
# 证书的签名密码,如果是自己生成的证书在输入信息时会有输入
server.ssl.key-store-password=******
# 证书类型,常见的两种证书类型有:PKCS12和JKS,这里需要注意证书类型不能写错了,否则项目启动时会报错
server.ssl.keyStoreType=JKS

如我在项目的application.properties中配置

复制代码
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=wtyy

重启项目,即可使用https://localhost:{port}/xxx访问了。

二、同时支持https和http

上述配置了https后,使用http访问会报错,如果需要同时支持https和http访问,

因一个项目只能配置一个 server.port,所以要支持http访问需要用Java代码实现。

1、添加http端口配置

如我在配置文件新增

复制代码
http.port=9999
2、编写java配置类
复制代码
/**
 * 
 * @function   http访问配置类
 *
 */
@Configuration
public class TomcatConfig {
    
    @Value("${http.port}")
    private int httpPort;

    @Bean
    public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
        return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {

            @Override
            public void customize(ConfigurableWebServerFactory factory) {
                if (factory instanceof TomcatServletWebServerFactory) {
                    TomcatServletWebServerFactory webServerFactory = (TomcatServletWebServerFactory)factory;
                    Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
                    // 设置http访问的端口号,不能与https端口重复,否则会报端口被占用的错误
                    connector.setPort(httpPort);
                    webServerFactory.addAdditionalTomcatConnectors(connector);
                }
            }
        };
    }
      
}

之后就可以使用这个9999端口号进行http访问了。

参考 spring-boot/spring-boot-samples/spring-boot-sample-tomcat-multi-connectors/src/main/java/sample/tomcat/multiconnector/SampleTomcatTwoConnectorsApplication.java at v2.0.0.RELEASE · spring-projects/spring-boot · GitHub

相关推荐
张紫娃7 分钟前
Spring @Scope, @Lazy, @DependsOn, @Required, @Lookup
java·后端·spring
是梦终空12 分钟前
JAVA毕业设计227—基于SpringBoot+hadoop+spark+Vue的大数据房屋维修系统(源代码+数据库)
hadoop·spring boot·spark·vue·毕业设计·源代码·大数据房屋维修系统
結城1 小时前
Spring Security如何拿到登录用户的信息
java·spring·mybatis
诺浅8 小时前
AWS S3 SDK FOR JAVA 基本使用及如何兼容七牛云
java·spring boot·aws
野生技术架构师10 小时前
SpringBoot集成Tess4j :低成本解锁OCR 图片识别能力
spring boot·后端·ocr
sg_knight11 小时前
Ribbon负载均衡实战指南:7种策略选择与生产避坑
java·spring boot·spring·spring cloud·微服务·ribbon·负载均衡
猩猩之火11 小时前
XWPFTemplate生成word
spring boot·word·动态word
述雾学java12 小时前
Spring Boot + Vue 前后端分离项目解决跨域问题详解
vue.js·spring boot·后端
酷爱码12 小时前
Spring Boot 中实现 HTTPS 加密通信及常见问题排查指南
spring boot·后端·https
寒冰碧海12 小时前
Spring Boot循环依赖全场景解析与终极解决方案
java·spring boot·后端