
Spring 5
Spring 5有很多更新,其中就有对HTTP 2.0的推送资源的支持。我们来用一个简单的示例展示该功能。
一 创建工程
到网站
https://start.spring.io/
初始化一个Spring Boot的maven工程,需要选中web和Thymeleaf

初始化工程
选择Generate Project就会下载一个压缩包。
二 配置自签名证书
由于需要运行在https协议之上,所以我们创建一个自签名证书。
解压上面下载的压缩包,进入到目录
push-demo\src\main\resources
运行命令:
keytool -genkey -alias demo -keyalg rsa -dname "CN=Demo" -keystore demo.jks -storetype JKS

用keytool生成jks文件
提示输入密码的时候输入password
三 编写代码
在IntellJ中导入该工程(也可以使用别的IDE)。
1.启用https的配置
修改application.properties文件,内容如下:
server.http2.enabled=true server.ssl.key-store=classpath:demo.jks server.ssl.key-password=password server.ssl.key-alias=demo server.ssl.key-store-type=JKS

该配置文件启用https,并且使用我们上一步配置的证书
2.静态文件
在template文件夹下创建文件push.html
Push Example Hello World
![]()

html文件
在static/img目录下放置引用到的图片文件

3.编写Controller代码
在包com.example.pushdemo下创建类PushController.java,代码内容如下
package com.example.pushdemo; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.PushBuilder; @Controller @RequestMapping("push") public class PushController { @GetMapping("with") public String demoWithPush(PushBuilder pushBuilder){ if(null!=pushBuilder){ pushBuilder.path("/img/spring5.png").push(); } return "push"; } @GetMapping("without") public String demoWithoutPush(){ return "push"; } }

Controller代码
至此代码编写完成。
四 测试
运行PushDemoApplication.java

打开浏览器分别测试两个URL
https://localhost:8080/push/without https://localhost:8080/push/with
两个URL,一个没有用push,一个用服务端push

没有push效果
下面是有服务端推送效果的截图,可以看到chrome的开发者工具中显示push字样,并且Waterfall和没有推送的请求不一样。

有服务端推送效果
这个简单的网页看不出多少推送的效果,如果网页比较复杂,内容比较多,服务端主动推送可以提升用户体验,加快网页加载速度。