我们在前面已经配置SSL和开启了HTTP/2(https://blog.youkuaiyun.com/wiselyman/article/details/106121219),我们只需要在控制器方法里的参数使用javax.servlet.http.PushBuilder
对象即可使用HTTP/2的推送技术。PushBuilder
主动将资源推送到客户端(浏览器);这个特性也需要浏览器的支持,当然现代浏览器绝大部分都支持这个功能。
HttpBuilder
属于builder模式,主要方法有:
path
:中间操作,指定需推送的资源的地址;addHeader
:中间操作,设定资源的内容类型;push
:终结操作,执行推送动作。
HttpBuilder
推送的服务端资源是通过ResourceHttpMessageConverter
来确定媒体类型和转换的,所以在Spring MVC下我们是不需要显示指定媒体类型的。
我们在static
目录下新建push
目录,并加入下面的资源:
这里面重要的push.html
,它是服务端推送的终点。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>HTTP/2 Push Demo</title>
<link rel="stylesheet" href="/push/push.css" />
<link rel="stylesheet" href="/push/not-push.css" />
<script type="application/javascript" src="/push/push.js"></script>
<script type="application/javascript" src="/push/not-push.js"></script>
</head>
<body>
<img src="/push/wyn.jpg"/>
</body>
</html>
当前页面的资源push.css
、push.js
和wyn.jpg
是服务端推送的,not-push.css
和not-push.js
是正常情况。
演示的控制器内容:
@Value("classpath:/static/push/push.html")
private Resource pushPage; //1
@GetMapping(value = "/http2-push")
public Resource http2Push(PushBuilder pushBuilder) { //2
pushBuilder
.path("push/wyn.jpg") //3
// .addHeader("content-type", MediaType.IMAGE_JPEG_VALUE) //4
.push(); //5
pushBuilder
.path("push/push.css") //3
// .addHeader("content-type", "text/css") //4
.push(); //5
pushBuilder
.path("push/push.js") //3
// .addHeader("content-type", "application/javascript") //4
.push(); //5
return pushPage;
}
- 本书不会引入页面模板引擎技术(Thymeleaf等),所有的网页内容都是静态的。我们为了使用REST服务打开静态页面,方法返回值
Resource
也是通过ResourceHttpMessageConverter
确定资源的媒体类型(text/html
)并将载静态页面返回给浏览器;这个静态页面即我们要推送的目的地;若您使用了页面模版引擎技术,你可简单返回页面的路径即可; - 可以在控制器方法参数中直接注入
PushBuilder
对象; - 使用
path
方法指定需要推送资源的位置; - 使用
addHeadr
设定推送资源的内容类型, - 使用
push
方法推送。
我们使用Chrome访问https://localhost:8443/async/http2-push,并打开Chrome的控制台:
新书推荐:
我的新书《从企业级开发到云原生微服务:Spring Boot 实战》已出版,内容涵盖了丰富Spring Boot开发的相关知识
购买地址:https://item.jd.com/12760084.html
主要包含目录有:
第一章 初识Spring Boot(快速领略Spring Boot的美丽)
第二章 开发必备工具(对常用开发工具进行介绍:包含IntelliJ IDEA、Gradle、Lombok、Docker等)
第三章 函数式编程
第四章 Spring 5.x基础(以Spring 5.2.x为基础)
第五章 深入Spring Boot(以Spring Boot 2.2.x为基础)
第六章 Spring Web MVC
第七章 数据访问(包含Spring Data JPA、Spring Data Elasticsearch和数据缓存)
第八章 安全控制(包含Spring Security和OAuth2)
第九章 响应式编程(包含Project Reactor、Spring WebFlux、Reactive NoSQL、R2DBC、Reactive Spring Security)
第十章 事件驱动(包含JMS、RabbitMQ、Kafka、Websocket、RSocket)
第11章 系统集成和屁股里(包含Spring Integration和Spring Batch)
第12章 Spring Cloud与微服务
第13章 Kubernetes与微服务(包含Kubernetes、Helm、Jenkins、Istio)
多谢大家支持。