如何解决springboot中配置多个yml以及配置https

一、配置多个yml

在这里插入图片描述

第一步:新增的yml命名:必须以application开头

eg:application-hp.yml 其中的hp可以换成你自己命名的名字

第二步:配置主yml,所谓的主yml指的是application.yml

在主yml中配置如下:

spring:
  profiles:
    active: hp(可以动态根据需求激活自己的配置环境) #@profileActive@

使用@profileActive@的话,在进行maven打包时可以动态绑定所选择的配置文件yml

第三步:配置pom.xml

在build标签下添加

<resources>
    <resource>
         <directory>src/main/resources</directory>
         <!-- 处理文件时替换文件中的变量 -->
         <filtering>true</filtering>
         <excludes>
             <!-- 打包时排除文件 -->
             <exclude>application.yml</exclude>
             <exclude>application-hp.yml</exclude>
         </excludes>
     </resource>
     <resource>
         <directory>src/main/resources</directory>
         <filtering>true</filtering>
         <!-- 打包时所包含得文件 -->
         <includes>
             <include>application.yml</include>
             <include>application-${profileActive}.yml</include>
         </includes>
     </resource>
 </resources>

在project标签下添加

<profiles>
    <profile>
        <id>hp</id>
        <properties>
            <profileActive>hp</profileActive>
        </properties>
    </profile>
</profiles>

完成如上修改后
idea中的maven栏会出现如下图所示
在这里插入图片描述
完成这一步后,可以在maven的lifecycle下package时,选择对应名称的配置文件,再通过@profileActive@进行动态绑定

二、配置Https

第一步:在Application.java启动类下,加入如下代码:

@Bean
public TomcatServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
        @Override
        protected void postProcessContext(Context context) {
            SecurityConstraint constraint = new SecurityConstraint();
            constraint.setUserConstraint("CONFIDENTIAL");
            SecurityCollection collection = new SecurityCollection();
            collection.addPattern("/*");
            constraint.addCollection(collection);
            context.addConstraint(constraint);
        }
    };
    tomcat.addAdditionalTomcatConnectors(httpConnector());
    return tomcat;
}

/**
 * 方便用户可以从http重定向到http,不过用的是Get请求,谨记!!!!!!
 * @return
 */
@Bean
public Connector httpConnector() {
    Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
    connector.setScheme("http");
    //Connector监听的http的默认端口号80
    connector.setPort(80);
    connector.setSecure(false);
    //监听到http的端口号后 会 重定向用Get方法 到的https的端口号,也就是项目配置的port
    connector.setRedirectPort(443);
    return connector;
}

关于 Http11NioProtocolHttp11ProtocolHttp11AprProtocol的区别 方面大家有兴趣可以自己查找一下。

第二步:购买或加载SSL(TSL证书)

生成SSL证书有以下两种方法

方法一:使用JDK自带的keytools创建证书
1.打开cmd,输入如下命令:
keytool -genkey -alias tomcat -keyalg RSA -keystore ./server.keystore

一切按照提示进行操作:
操作完成后,会在用户打开cmd的窗口生成server.keystore文件

2.拷贝证书文件到工程根目录

将生成的server.keystore拷贝到需要支持HTTPS访问服务的根目录,然后进行配置。

在application.properties,加入下列配置:

server.port=443
server.ssl.key-store=server.keystore
server.ssl.key-alias=tomcat
server.ssl.enabled=true
server.ssl.key-store-password=123456
server.ssl.key-store-type=JKS

或者在application.yml,加入下列配置:

ssl:
 key-store: server.keystore
 enabled: true
 key-store-password: 123456
 key-store-type: JKS

注:这里将服务器端口号设置成443端口,即https的默认访问端口,那么在进行https访问的时候可以不带端口号直接访问,如果端口被占用使用,则需要解决端口占用问题了。

3.如何解决端口占用问题

Linux :

  1. 查找占用的端口 lsof -i:8081
  2. 撤销端口所占用的进程 kill -9 “PID”

Window10

  1. 查找占用的端口 netstat -ano|findstr “8081”
  2. 撤销端口所占用的进程 taskkill /f /t /im Tencentdl.exe
方法二:使用购买的SSL证书

其安装步骤如下链接:

Tomcat服务器安装SSL证书
https://help.aliyun.com/knowledge_detail/95496.html

Apache服务器安装SSL证书
https://help.aliyun.com/knowledge_detail/95493.html

Nginx/Tengine服务器安装SSL证书
https://help.aliyun.com/knowledge_detail/95491.html


IIS服务器SSL证书安装
https://help.aliyun.com/knowledge_detail/95502.html

出现的问题

1、由于多yml的配置,有可能导致SSL引入不成功,在项目部署的时候会一直出现443端口启动不正常的情况,如下图所示:
2020-12-14 22:17:56.972 ------ [ main ] ------ [ INFO  ] [ com.example.demo.HpApplication : 55 ] - Starting HpApplication v0.0.1-SNAPSHOT on WIN-6PS7HH53FCI with PID 4248 (C:\Users\Administrator\Desktop\hp\demo-0.0.1-SNAPSHOT.jar started by Administrator in C:\Users\Administrator\Desktop\hp)
2020-12-14 22:17:56.983 ------ [ main ] ------ [ INFO  ] [ com.example.demo.HpApplication : 655 ] - The following profiles are active: hp
2020-12-14 22:18:00.921 ------ [ main ] ------ [ INFO  ] [ org.apache.coyote.http11.Http11NioProtocol : 173 ] - Initializing ProtocolHandler ["https-jsse-nio-443"]
2020-12-14 22:18:00.923 ------ [ main ] ------ [ INFO  ] [ org.apache.coyote.http11.Http11NioProtocol : 173 ] - Initializing ProtocolHandler ["http-nio-8080"]
2020-12-14 22:18:00.938 ------ [ main ] ------ [ INFO  ] [ org.apache.catalina.core.StandardService : 173 ] - Starting service [Tomcat]
2020-12-14 22:18:00.938 ------ [ main ] ------ [ INFO  ] [ org.apache.catalina.core.StandardEngine : 173 ] - Starting Servlet engine: [Apache Tomcat/9.0.29]
2020-12-14 22:18:01.042 ------ [ main ] ------ [ INFO  ] [ o.a.c.core.ContainerBase.[Tomcat].[localhost].[/] : 173 ] - Initializing Spring embedded WebApplicationContext
2020-12-14 22:18:02.217 ------ [ main ] ------ [ INFO  ] [ org.apache.coyote.http11.Http11NioProtocol : 173 ] - Starting ProtocolHandler ["https-jsse-nio-443"]
2020-12-14 22:18:02.425 ------ [ main ] ------ [ INFO  ] [ org.apache.coyote.http11.Http11NioProtocol : 173 ] - Pausing ProtocolHandler ["https-jsse-nio-443"]
2020-12-14 22:18:02.426 ------ [ main ] ------ [ INFO  ] [ org.apache.catalina.core.StandardService : 173 ] - Stopping service [Tomcat]
2020-12-14 22:18:02.445 ------ [ main ] ------ [ INFO  ] [ org.apache.coyote.http11.Http11NioProtocol : 173 ] - Stopping ProtocolHandler ["https-jsse-nio-443"]
2020-12-14 22:18:02.446 ------ [ main ] ------ [ INFO  ] [ org.apache.coyote.http11.Http11NioProtocol : 173 ] - Destroying ProtocolHandler ["https-jsse-nio-443"]
2020-12-14 22:18:02.475 ------ [ main ] ------ [ INFO  ] [ com.alibaba.druid.pool.DruidDataSource : 2003 ] - {dataSource-0} closing ...

在这里大家可以不必太过苦恼,应为这个问题也让我怀疑人生了很久,直至一上午过去了,才留意到,问题原来出现在ssl证书引入不成功!!这里先说一下上图发生的几种情况:

- 端口占用,这时候大家可以通过上诉方法在服务器上查找是否存在443端口被占用的情况
- 配置方面:数据库配置出错,redis配置出错等都会引起程序的死亡。所以大家可以把目光放在yml、properise上
- SSL文件引入路径不正确,这个问题也是我刚刚发现的!!就详细说一下,首先在单yml的情况下,也就是只有一个application.yml,如上述的ssl配置流程时基本无问题的,就看你的ssl文件放在项目文件的什么地方。

情况一:放在项目根目录

图来自https://blog.csdn.net/qq_41723044/article/details/96111517?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control
这时只要ssl在yml中的配置里面的key-store改为如下

ssl:
  key-store: 文件名字

情况二:放在项目resourse目录下,则

ssl:
  key-store: classpath:文件名字

情况三:通过绝对路径引入,就是将ssl文件放在服务器磁盘目录下,直接用C:/引入

ssl:
  key-store: C:\Users\Administrator\Desktop\文件名字
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值