在 Spring Boot 项目中,可以内置 Tomcat、Jetty、Undertow、Netty等容器。
一、Tomcat 配置
当开发者添加了spring-boot-starter-web 依赖之后,默认会使用 Tomcat 作为 Web 容器。
1、常规配置
(1)要对 Tomcat 进行进一步的配置,可以在 application.properties 或者 application.yaml 中进行配置,
(2)下面我们以 application.properties 为例 添加入配置:
server.port=8081
server.servlet.context-path=/yby
server.error.path=/error
server.servlet.session.timeout=30m
server.tomcat.uri-encoding=UTF-8
server.tomcat.threads.max=400
server.tomcat.basedir=/home/yby/web
配置参数说明:
• server.port 配置了Web容器的端口号,默认为 8080
• error.path 配置了当项目出错时跳转去的页面。
• session.timeout 配置了session失效时间,30m表示30分钟,如果不写单位,默认单位是秒。由于Tomcat中配置session过期时间以分钟为单位,因此这里单位如果是秒的话,该时间会被转换为一个不超过所配置秒数的最大分钟数,例如这里配置了119,默认单位为秒,则实际session过期时间为1分钟。
• context-path表示项目名称,不配置时默认为/。如果配置了,就要在访问路径中加上配置的路径。
• uri-encoding表示配置Tomcat请求编码。
• max-threads表示Tomcat最大线程数。
• basedir是一个存放Tomcat运行日志和临时文件的目录,若不配置,则默认使用系统的临时目录。
当然,Web容器相关的配置不止这些,这里只列出了一些常用的配置,完整的配置可以参考官方文档 Appendix A. Commonapplication properties 一节。
(3) 重新启动项目,因为 我们配置了 端口号为 8081 我们访问的时候需要把端口改为 8081,如下所示:
二、Jetty配置
(1)、添加 Jetty 的依赖,
主要在 pom.xml 文件中 把 spring-boot-starter-web 中除去默认的 Tomcat,然后加入 Jetty 的依赖即可。
配置方式如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 移除默认内置的Tomcat服务器 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加 jetty 服务器的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
(2)、重启项目,查看日志输出
从日志输出中我们看到是以 Jetty 服务启动的。
三、Undertow配置
Undertow 是一个红帽公司开源的Java服务器,具有非常好的性能,在 Spring Boot 中也得到了很好的支持,配置方式与Jetty类似。
(1)、添加修改配置。
把原来 jetty 配置改为 undertow 的依赖即可。配置如下所示:
<!-- 添加 undertow 服务器的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
(2)、重启项目,查看日志输出。
从日志输出中我们看到是以 Undertow 服务启动的。
四、HTTPS 配置
由于HTTPS具有良好的安全性,在开发中得到了越来越广泛的应用,像微信公众号、小程序等的开发都要使用HTTPS来完成。对于个人开发者而言,一个HTTPS证书的价格还是有点贵,国内有一些云服务器厂商提供免费的HTTPS证书,一个账号可以申请数个。不过在jdk中提供了一个Java数字证书管理工具keytool,在\jdk\bin目录下,通过这个工具可以自己生成一个数字证书。下面为了方便演示,我们就以 JDK 自带 keytool 工具生成证书。
(1)、使用 keytool 生成证书
keytool -genkey -alias httpstest -keyalg RSA -keysize 2048 -keystore test1.p12 -validity 365
参数说明:
- -genkey:表示要创建一个新的密钥
- -alias:表示 keystore 的别名
- -keyalg:表示使用的加密算法是 RSA(一种非对称加密算法)
- -keysize:表示密钥的长度
- -keystore:表示生成的密钥存放位置
- -validity:表示密钥的有效时间(单位为天)
(2)、拷贝文件
在cmd窗口中直接执行如上命令,在执行的过程中需要输入密钥口令等信息,根据提示输入即可。命令执行完成后,会在当前用户目录下生成一个名为test.p12的文件。然后把 此文件拷贝到 项目的根目录下。如下所示:
(3)、添加配置
拷贝完文件后,在 项目的 application.properties 文件中添加如下配置:
# 密钥文件名
server.ssl.key-store=test1.p12
# 密钥别名
server.ssl.key-alias=httpstest
# 在生成密钥时在 cmd 命令中输入的密钥口令
server.ssl.key-store-password=123456
(4)、配置完成后,重启项目 通过 https 访问。
由于证书不被浏览器认可,会出现如上图所示的提示。点击高级继续前往,成功访问。
(5)、将HTTP请求重定向为HTTPS请求。
因为Spring Boot不支持同时在配置中启动HTTP和HTTPS。这个时候如果在通过 HTTP 访问就会出现如下错误:
配置重定向
我们首先配置一个 TomcatServletWebServerFactory,然后添加一个 Tomcat 中的 Connector(监听 8080 端口),并将请求转发到 8081 上去。
代码如下所示:
@Configuration
public class Http2HttpsConfig {
@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;
}
}
重新启动服务,在浏览器中输入 http://localhost:8080/yby/hello 将会从定向到 https://localhost:8081/yby/hello 上去。