瀏覽器端CORS策略+快取策略導致的跨域策略失效問題
問題現象
DataV的螢幕上發現了這麼個詭異的現象:
在開發的螢幕中,用xhr載入圖片供canvas渲染,時好時壞,報錯的異常是:跨域失敗,檢視network的請求,在失敗的時候,圖片返回的header裡確實缺失了cors的幾個關鍵資訊。
而且開發的同學經常是好的,到了使用者手裡就不行。
伺服器端的oss策略仔細檢查了,沒有問題, 而且螢幕上有時候是好的,說明服務至少正常過。oss的介面冪等基本上不用懷疑,所以把疑問再次轉回到客戶端。
在一次本地重現之後,在network裡過濾出錯圖片地址,結果發現除了 xhr的請求,還有一個標籤發起的請求, 把偵錯程式的快取關閉之後,重新整理螢幕頁面,重現了。
故障原因
上述頁面有兩個請求指向同一個 圖片地址, 當img標籤先行的時候,
<img src="pic.png"/>
瀏覽器返回了圖片,但是由於img標籤發起請求的時候並不會帶上 Origin頭,所以Aliyun OSS在返回的response header 裡並沒有帶上 cors需要的 Access-Control-Allow-Origin
等資訊,因為 標籤並不受同源策略限制。 於是瀏覽器 cache了這個圖片請求,當然也包括header資訊。
當 xhr再次發起對這個圖片的請求時,命中了瀏覽器快取,這時候問題就出現了,header裡沒有告訴xhr可以信任當前域,所以瀏覽器拒絕了這個請求。
解決辦法
最簡單的辦法,把兩個呼叫地址區分開,xhr可以加個 ?xhr
所以這種異常,不是OSS的鍋
瀏覽器需要改進麼?
目前瀏覽器快取策略只是根據資源地址來cache,並沒有區分呼叫形式,以及呼叫時header的差異。
作為資源cache,也合情合理。
不過歷史原因, 圖片資源、script標籤 等,瀏覽器一直沒有對這些請求開啟同源策略限制,當然也無法開啟(一旦大量的站點要掛)。
有沒有必要開啟? 能不能開啟? 這是另外的問題,但是Origin的頭可以先帶上。
相關文章
- 瀏覽器快取策略瀏覽器快取
- 快取策略之瀏覽器快取瀏覽器
- 深入剖析瀏覽器快取策略瀏覽器快取
- 我理解的瀏覽器快取策略瀏覽器快取
- 徹底弄懂瀏覽器快取策略瀏覽器快取
- 簡易筆記:瀏覽器快取策略筆記瀏覽器快取
- Redis篇:持久化、淘汰策略,快取失效策略Redis持久化快取
- 瀏覽器同源策略及 Ajax 跨域解決方案瀏覽器跨域
- FE.B-理解瀏覽器的同源策略與跨域方案瀏覽器跨域
- 前端web:瀏覽器靜態資源快取策略前端Web瀏覽器快取
- 瀏覽器的同源策略瀏覽器
- 同源策略和跨域訪問跨域
- 快取策略快取
- 也談談同源策略和跨域問題跨域
- 再談量化策略失效的問題
- redis AOF落地策略rewrite導致阻塞問題Redis
- 同源策略和跨域跨域
- SDWebImage的快取策略Web快取
- Flutter 的快取策略Flutter快取
- HTTP - 快取策略HTTP快取
- 吐槽: 移動端快取策略快取
- 學習AJAX必知必會(5)~同源策略、解決跨域問題(JSONP、CORS)跨域JSONCORS
- 瀏覽器安全策略說之內容安全策略CSP瀏覽器
- iptables 重啟後ftp 策略失效的問題FTP
- RN的快取策略探索快取
- Java Integer的快取策略Java快取
- 前端效能優化 —— 移動端瀏覽器優化策略前端優化瀏覽器
- 《Asp.Net Core3 + Vue3入坑教程》 - 配置CORS策略解決跨域問題ASP.NETVueCORS跨域
- 新版 google 谷歌瀏覽器跨域問題Go谷歌瀏覽器跨域
- 跨域?如何解決?同源策略?跨域
- 由同源策略到前端跨域前端跨域
- 秒懂前端的快取策略前端快取
- Web 專案的快取策略Web快取
- PWA常見的快取策略快取
- 理解Java Integer的快取策略Java快取
- 資料物件的快取策略物件快取
- 佈置IE瀏覽器防黑策略的方法瀏覽器
- 前端效能優化之移動端瀏覽器優化策略前端優化瀏覽器