【问题标题】:HTTP2 server push preloading does not send cookie dataHTTP2服务器推送预加载不发送cookie数据
【发布时间】:2016-09-01 19:09:05
【问题描述】:

鉴于 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,因此推测它应该像任何其他类型的请求一样处理。

【问题讨论】:

  • 你有没有机会想出一个可以添加作为答案的解决方法?

标签: xmlhttprequest preload server-push http2


【解决方案1】:

服务器推送本质上是在客户端发出一个 TCP 请求后将数据 TCP 向下推送到客户端。客户端从客户端接收数据的唯一机会是在初始请求中。客户端无法将服务器推送回服务器。

说到 cookie;您需要从原始请求中获取它们,当数据被推送时,服务器没有机会接收额外的标头。服务器发送的事件或 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 部分详细介绍了它如何包含标头块片段。

让我留下以下引述:

HTTP 2.0 服务器推送不能替代诸如 服务器发送事件 (SSE) 或 WebSocket。通过 HTTP 传递的资源 2.0 服务器推送由浏览器处理,但不会冒泡到应用程序代码 - 没有 JavaScript API 来获取通知 对于这些事件。

有关于如何实现此功能的 Node.js 代码示例:Innovating with HTTP 2.0 Server Push

【讨论】:

  • 感谢您的详细回复。我现在很清楚这个顺序,但为什么它会阻止发送在当前集体请求之前设置的 cookie?例如,持久会话 ID。没有必要收到任何东西。
猜你喜欢
  • 2017-08-31
  • 2016-06-14
  • 2015-06-03
  • 2019-08-11
  • 2016-10-24
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
相关资源
最近更新 更多