一、配置多个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;
}
关于 Http11NioProtocol、Http11Protocol和 Http11AprProtocol的区别 方面大家有兴趣可以自己查找一下。
第二步:购买或加载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 :
- 查找占用的端口 lsof -i:8081
- 撤销端口所占用的进程 kill -9 “PID”
Window10
- 查找占用的端口 netstat -ano|findstr “8081”
- 撤销端口所占用的进程 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文件放在项目文件的什么地方。
情况一:放在项目根目录
这时只要ssl在yml中的配置里面的key-store改为如下
ssl:
key-store: 文件名字
情况二:放在项目resourse目录下,则
ssl:
key-store: classpath:文件名字
情况三:通过绝对路径引入,就是将ssl文件放在服务器磁盘目录下,直接用C:/引入
ssl:
key-store: C:\Users\Administrator\Desktop\文件名字