
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和没有推送的请求不一样。

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