- 常规配置
spring-boot-stater-web依赖默认会使用Tomcat作为Web容器。
对Tomcat进一步配置可以在application.properties中进行。
server.port=8081
server.error.path=/error
server.servlet.session.timeout=30m
server.servlet.context-path=/springboot_demo
server.tomcat.uri-encoding=UTF-8
server.tomcat.max-threads=500
server.tomcat.basedir=/home/sang/tmp
其中:
- server.port 配置了 Web 容器的端口号。
- error.path 配置了当项目出错时跳转去的页面。
- session.timeout 配置了 session 失效时间,30m表示30分钟,如果不写单位而,默认单位是秒。(由于 Tomcat 中配置session 过期时间以分钟为单位,因此这里单位如果是秒的话,该时间会被转换为一个不超过所配置秒数的最大分钟数)。
- context-path 表示项目名称,不配置时默认为/,如果配置了,就要在访问路径中加上配置的路径。
- uri-encoding 表示配置 Tomcat 请求编码。
- max-threads 表示 Tomcat 最大线程数。
- basedir 是一个存放 Tomcat 运行日志和临时文件的目录,若不配置则默认使用系统的临时目录。
更多配置参考官方文档。
- HTTPS配置
jdk中提供了一个 Java 数字证书管理工具 keytool ,在 \jdk\bin 目录下,通过这个工具可以自己生成一个数字证书,生成命令如下:
keytool -genkey -alias tomcat https -keyalg RSA -keysize 2048 -keystore sbaby.p12 -validity 365
其中:
- -genkey 表示要创建一个新的秘钥。
- -alias 表示 keystore 的别名
- -keyalg 表示使用的加密算法是RSA,一种非对称加密算法。
- -keysize 表示秘钥的长度。
- -keystore 表示生成的密钥存放位置。
- -validity 表示密钥的有效时间,单位为天。
在执行的过程中需要输入密钥口令等信息,根据提示输入即可。命令执行完成后,会在当前用户目录下生成一个名为 sbaby.p12 的文件,将这个文件复制到项目的根目录下,然后在 application.properties 中做如下配置:
server.ssl.key-store=sbaby.p12
server.ssl.key-alias=tomcathttps
server.ssl.key-store-password=创建证书时设置的口令
其中:
- key-store 表示密钥文件名。
- key-alias 表示密钥别名。
- key-store-password 就是在 cmd 命令执行过程中输入的密码。
配置成功后启动项目,使用 https 访问接口来查看结果。(证书是自己生成的,不被浏览器认可,此时添加信任或者继续前进即可)。如图:
此时以 HTTP 的方式访问接口就会访问失败,如图:
因为 Spring Boot 不支持同时在配置中启动 HTTP 和 HTTPS。这个时候可以配置请求重定向,将 HTTP 请求重定向为 HTTPS 请求。如下:
/**
* @Author Sbaby
* @Date 2019/11/22 21:50
* @Version 1.0
*/
@Configuration
public class TomcatConfig {
@Bean
TomcatServletWebServerFactory tomcatServletWebServerFactory(){
TomcatServletWebServerFactory factory = 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);
}
};
factory.addAdditionalTomcatConnectors(createTomcatConnector());
return factory;
}
private Connector createTomcatConnector(){
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(8081);
return connector;
}
}
这里首先配置一个 TomcatServletWebServerFactory,然后添加一个 Tomcat 中的 Connect (监听 8080 端口),并将请求转发到 8081 上去。
注意:笔者在实验过程中遇到了一个很常见的问题,在使用 HTTPS 访问页面时报错
java.lang.UnsatisfiedLinkError: org.apache.tomcat.jni.SSL.renegotiatePending(J)I
最后在 StackOverflow 上了解到,只需要将 SpringBoot 的版本改成之前的即可,(2.2.1.RELEASE TO 2.1.0.RELEASE),应该是 Tomcat 的原因,具体参考链接。