鉴于Cloudflare对HTTP2服务器推送的新支持,我正在尝试预加载在HTML正文末尾的Javascript中运行的AJAX请求。测试在Chrome Canary中完成。请求在标头中进行,因此可以在再次请求时缓存以立即加载。
标题是:
Link: </request>; rel=preload;
这成功触发了https://www.example.org/request。它发送到该URL的请求标头是:
接受: * / *
参考者: https://www.example.org/request
用户代理: Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 52.0.2726.0 Safari / 537.36
X-Requested-With: XMLHttpRequest
问题是cookie数据不会随预加载请求一起发送,而是与现有的Javascript一起发送。我根本找不到关于如何解决这个问题的信息,甚至找不到正确的行为。规范中似乎没有提及cookie,因此可能应该按照任何其他类型的请求进行处理。
答案 0 :(得分:1)
在客户端发出一个TCP请求后,服务器推送基本上将数据TCP推送到客户端。客户端从客户端接收数据的唯一机会是初始请求。客户端无法将服务器推送回服务器。
谈到饼干;您需要从原始请求中获取它们,在推送数据时,服务器没有机会接收其他标头。服务器发送的事件或WebSockets可以提供帮助 我们在这里。
如RFC 7540中所述。
A complete header block consists of either:
a single HEADERS or PUSH_PROMISE frame, with the END_HEADERS flag
set, or
a HEADERS or PUSH_PROMISE frame with the END_HEADERS flag cleared
and one or more CONTINUATION frames, where the last CONTINUATION
frame has the END_HEADERS flag set.
该RFC的PUSH_PROMISE 4.3节详细介绍了它如何包含标题块片段。
让我留下以下引用:
中实现此功能的Node.js代码示例HTTP 2.0服务器推送不是诸如此类技术的替代品 服务器发送事件(SSE)或WebSocket。通过HTTP提供的资源 2.0服务器推送由浏览器处理,但不会冒泡到应用程序代码 - 没有JavaScript API来获取通知 对于这些事件。