2016-05-06 108 views
0

鑑於Cloudflare對HTTP2服務器推送的新支持,我試圖預加載一個AJAX請求,該請求在HTML主體的末尾以Javascript運行。測試在Chrome Canary中完成。請求是在頭文件中完成的,因此可以在請求時立即加載它。HTTP2服務器推送預加載不發送cookie數據

標題是:

Link: </request>; rel=preload;

這成功地觸發關閉該https://www.example.org/request。該請求頭其發送到網址是:

接受: */*

的Referer:https://www.example.org/request

的User-Agent:的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,所以推測它應該作爲任何其他類型的請求來處理。

回答

2

服務器推送從客戶端發出一個TCP請求後,將數據TCP基本上推送到客戶端。客戶端客戶端從客戶端接收數據的唯一機會在最初的請求中。客戶端無法將服務器推回服務器。

HTTP2 Server Push Diagram

當談到餅乾;您將需要從原始請求獲取它們,當數據被推送時服務器沒有機會接收額外的頭文件。服務器發送的事件或WebSocket可以幫助我們在這裏。如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. 

該PUSH_PROMISE 4.3節的RFC詳細介紹了它如何能夠包含頭塊分段。

讓我離開你用下面的話:

HTTP 2.0服務器推送不是技術,如 服務器發送的事件(SSE)或WebSocket的一個替代品。通過HTTP 2.0服務器推送的資源由瀏覽器處理,但不會冒泡到應用程序代碼 - 沒有JavaScript API可以爲這些事件獲取通知 。

有關於如何在實現這個Node.js的代碼示例:Innovating with HTTP 2.0 Server Push

+0

感謝您的詳細答覆。現在我的命令很清楚,但爲什麼它會阻止發送在當前集體請求之前設置的cookie?例如,持久會話ID。沒有必要收到任何東西。 – StackOverflowAcc