文章目录
1. 指定容器
Spring Boot项目当我们添加了web依赖后,项目会内嵌有一个Tomcat(自动添加Tomcat依赖)。Spring Boot 2.2.4版本依赖的是tomcat9.0.30
我们可以在application.properties中配置容器的相关属性,例如:
#修改服务器端口号
server.port=8082
#修改项目的上下文路径
server.servlet.context-path=/test
#配置Tomcat URL编码
server.tomcat.uri-encoding=UTF-8
可以查看项目启动参数检查是否配置成功
当我们需要更改容器时,则在pom.xml中去除spring-boot-starter-web中的Tomcat依赖,并添加依赖即可。这里以添加jetty为例
再次启动项目,可以看到配置成功
2. 配置容器的端口
#指定容器端口号
server.port=8080
#不开放端口
#server.port=-1
#随机端口
#server.port=0
查看随机分配的端口,我们可以创建监听器监听Spring Boot的初始化事件,获取容器的端口。
@Component
public class MyApplicationListener implements ApplicationListener<WebServerInitializedEvent> {
@Override
public void onApplicationEvent(WebServerInitializedEvent webServerInitializedEvent) {
System.out.println("Server Port:"+webServerInitializedEvent.getWebServer().getPort());
}
}
3. 设置HTTP响应Gzip压缩
3.1 Gzip介绍
-
HTTP 协议支持GZIP 压缩机制,也称协议压缩。 HTTP GZIP压缩是由WEB服务器和浏览器共同遵守的协议,也就是说WEB服务器和浏览器都必须遵守。目前主流的服务器和浏览器都支持GZIP压缩技术。包括 Chrome、IE、FireFox、Opera 等;服务器有 tomcat、Apache 和 IIS 等。
-
GZIP 主要用来压缩html,css,javascript,等静态文本文件,也支持对动态生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等输出的网页也能进行压缩。
-
GZIP 压缩的比率通常在3~10 倍之间,这样可以大大节省服务器的网络带宽,大大提升浏览器的浏览速度。
-
GZIP 是一种数据压缩格式,默认且目前仅使用deflate算法压缩data部分;deflate是一种压缩算法,是huffman编码的一种加强。
-
协议压缩就是依据HTTP协议进行压缩,不需要程序员进行压缩,解压编码,而是把压缩过程交给WEB服务器,将解压过程交给客户端。 如果客户端为支持GZIP压缩的浏览器,那么解压过程也不需要程序员参与,浏览器会按照一定的规则自动进行解压缩;如果客户端为HttpClient ,那么就需要手动进行GZIP解码了。
-
压缩过程:客户端发送http请求,如果请求头header中携带Accept-Encoding: gzip,deflate (现在的浏览器一般默认都是这样),那么浏览器的意思是:服务器需要进行GZIP压缩,再看响应内容的类型是否满足服务器配置的需要压缩的类型,如果符合,那么WEB服务器在传输响应内容之前,会对响应内容进行压缩,并在响应头中添加Content-Encoding gzip;如果不符合,那么将不压缩,直接返回。
-
解压过程:(浏览器)客户端接收到响应,如果响应头中包含Content-Encoding GZIP,那么浏览器会自动将响应内容进行GZIP解压缩,然后再呈现在页面上。如果不包含,那么将直接呈现在页面上。
-
GZIP的缺点。相对于没有进行GZIP的工程来说,使用GZIP要增加服务器压缩的压力(cpu消耗)、客户端解压缩的压力,故而对服务器的配置需求更高。另外压缩也要耗费时间,想占用更小的空间,得到高压缩比率,肯定要牺牲较长的时间;反之,如果时间较为宝贵,要求快速,那么所得的压缩比率一定较小,当然会占用更大的空间了(压缩比率=原内容大小/压缩后大小,压缩比率越大,则表明压缩后占用空间的压缩包越小),这就是物理空间与时间的矛盾。
片段转自:https://www.cnblogs.com/DDgougou/p/8675504.html
3.2 Spring Boot配置Gzip
在实际项目开发过程为,如果由于服务端响应数据量较大,导致客户端下载响应数据的耗时较长,可以考虑开启Tomcat的gzip功能,对响应数据进行压缩。
开启gzip功能后,通过http请求header增加一个“Accept-Encoding:gzip”指令来告知服务器需要进行gzip压缩(当前浏览器都默认带有),而服务器接收到并处理完该请求后,通过新增加响应头“Content-Encoding:gzip
”来告知客户端进行gzip解压。
对于js、css、html三种常用的类型,压缩率比较可观可以大幅度提升网络的传输速度。当然使用gzip要增加服务器压缩的压力、客户端解压缩的压力。
在Spring Boot项目中可以在application.properties文件中进行配置:
#开启压缩
server.compression.enabled=true
#设置进行响应压缩的阈值,默认2KB
server.compression.min-response-size=2KB
#设置进行压缩的响应类型,具体要压缩的类型可以在浏览器的响应头Content-Type查看
#默认:"text/html", "text/xml", "text/plain", "text/css", "text/javascript", "application/javascript", "application/json", "application/xml"
server.compression.mime-types=*/*
创建一个响应结果大小比较大的接口,浏览器访问查看:
@RestController
@RequestMapping("/users")
public class UserController {
@GetMapping("/test")
public List<String> getAllUsersForTest(){
ArrayList<String> users = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
users.add("张三"+i);
}
return users;
}
}
没有开启响应压缩,请求响应结果:
开启响应压缩后,请求响应结果:
可以看到同样的结果,浏览器获得的数据大小从大约12KB降到了2KB,所以通过减少HTTP响应大小可以显著减少响应时间,提高Web容器的性能。
3.3 检查配置是否成功
去检测网站:http://seo.chinaz.com/?host=iitshare.com 查询下效果
4. Tomcat日志配置
Spring Boot项目中关于Tomcat常用的日志配置如下所示:
#开启访问日志,默认的日志位置在项目运行的临时目录中,默认的生成的日志的命令格式:access_log.2021-01-01.log
server.tomcat.accesslog.enabled=true
#Tomcat访问日志的保存目录
server.tomcat.basedir=tomcat-log
#生成日志文件名的前缀,默认是access_log
server.tomcat.accesslog.prefix=test_access_log
#生成日志文件名的后缀,默认是.log
server.tomcat.accesslog.suffix=.log
#日志文件名中的日期格式,默认是.yyyy-MM-dd
server.tomcat.accesslog.file-date-format=.yyyyMMdd
#生成的日志文件内容格式
#%h 请求客户端的ip
#%l 用户的身份
#%u 用户名
#%t 请求时间
#%r 请求地址
#%s 响应的状态码
#%b 响应的大小
server.tomcat.accesslog.pattern=%h %l %u %t \"%r\" %s %b
#服务器内部日志开启
logging.level.org.apache.tomcat=debug
logging.level.org.apache.catalina=debug
启动项目查看控制台的日志,可以看到服务器内部日志:
浏览器请求接口/users/test,可以看到生成了日志文件:
查看日志内容:
5. Tomcat配置HTTPS证书
5.1 HTTPS介绍
超文本传输安全协议(HyperText Transfer Protocol Secure),缩写:HTTPS;常称为 HTTP over TLS、HTTP over SSL 或 HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在 1994 年首次提出,随后扩展到互联网上。
企业开发的实际生产环境一般在Nginx中配置HTTPS证书。但我们个人练习时也可以很方便得在Spring Boot项目中配置HTTPS证书。
5.2 生成HTTPS证书
我们可以从各个云服务厂商处申请一个免费的HTTPS证书,或者直接借助 Java 自带的 JDK 管理工具 keytool 来生成一个免费的 HTTPS证书。
keytool -genkey -alias tomcathttps -keyalg RSA -keysize 2048 -keystore D:\https_test.p12 -validity 365
命令说明:
- genkey 表示要创建一个新的密钥。
- alias 表示 keystore 的别名。
- keyalg 表示使用的加密算法是 RSA ,一种非对称加密算法。
- keysize 表示密钥的长度。
- keystore 表示生成的密钥存放位置。
- validity 表示密钥的有效时间,单位为天。
命令执行完成后 ,我们在 D 盘目录下会看到一个名为 https_test.p12 的文件。
5.3 配置HTTPS证书
将上面生成的 https_test.p12 拷贝到 Spring Boot 项目的 resources 目录下。然后在 application.properties 中添加如下配置:
#配置https
#密钥文件名
server.ssl.key-store=classpath:https_test.p12
#密钥别名
server.ssl.key-alias=tomcathttps
#密钥口令
server.ssl.key-store-password=123456
配置完成后,就可以启动 Spring Boot 项目了,此时如果我们直接使用 Http 协议来访问接口,就会看到如下错误:
改用 https 来访问 ,因为我们自己生成的 https 证书不被浏览器认可,我们直接点击高级按钮选择继续访问就可以了。
因为Spring Boot 不支持同时启动 HTTP 和 HTTPS ,为了解决这个问题,我们需要配置请求转发,当用户发起 HTTP 请求时,自动转发到 HTTPS 上。以Tomcat容器为例:
@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(8081);
connector.setSecure(false);
connector.setRedirectPort(8080);
return connector;
}
}
这个配置类配置了HTTP 的请求端口为 8081,所有来自 8081 的请求,将被自动重定向到 8080 这个 HTTPS 的端口上。
重启项目后浏览器请求,使用http://localhost:8081/users/test
就会重定向到https://localhost:8080/users/test
。