2017-07-24 52 views
0

我有以下代碼中使用sendBeacon方法發送異步HTTP請求,由於安全問題,任何解決方法,sendBeacon API不能臨時工作?

var data = { 
name: 'test', 
uniqueId: Math.random() 
}; 
var blob = new Blob([JSON.stringify(data)], {type : 'application/json'}); 
navigator.sendBeacon('http://example.in/data/post', blob); 

此代碼已很長時間工作得很好。目前,由於鉻合金https://bugs.chromium.org/p/chromium/issues/detail?id=490015中的安全問題,我們看到錯誤「'在'導航器'上執行'sendBeacon'失敗:sendBeacon()與Blob的類型不是CORS安全列表的MIME類型在實驗上是不允許的,詳見http://crbug.com/490015

是否有任何解決方法通過使用相同的sendBeacon API修改請求標頭來發送JSON數據,直到問題得到解決?對於依賴於此API的網站繼續使用,直到做出修復,這將非常有用。有關使用XHR發佈數據的建議沒有用。

回答

1

的用於sendBeacon的Content-Type頭只允許值現在是:

  • 應用程序/ x-WWW窗體-urlencoded
  • 的multipart/form-data的
  • 文本/無格式

我在我們的項目中遇到過類似的問題,最後我以「text/plain; charset = UTF-8'並在服務器端讀取json內容的流。

客戶:

const blob = new Blob([JSON.stringify(myData)], { type: 'text/plain; charset=UTF-8' }); 
navigator.sendBeacon(appData.ReleaseSessionUrl, blob); 

服務器:

using (var reader = new StreamReader(this.Request.InputStream)) 
{ 
    var jsonData = reader.ReadToEnd(); 
    var sessionData = JsonConvert.DeserializeObject<MyDataType>(jsonData); 
} 

不知道這是否可以幫助你。

https://github.com/GoogleCloudPlatform/stackdriver-errors-js/issues/10

+0

雖然沒有直接回答我的用例,但它很有幫助。 – webblover

相關問題