CORS的簡單理解


去年我在做一個項目,是關於標簽打印的,它就是一個Windows程序,提供標簽打印功能,由其它程序(包括網站)告訴它需要打印怎樣的標簽,它就出標簽,這個“告訴它需要怎樣的標簽”的過程,是通過HTTP的Post請求實現的,我把這個程序做成一個Self-Host的小網站,接受來自各方面的HTTP請求,測試下來可行,我分別自己寫了個HTTP客戶端以及使用現成的Postman來測試,都沒問題。

直到項目上線前,發現瀏覽器沒辦法成功發送打印請求,原因是:瀏覽器默認情況下不允許跨站的異步請求。這啥意思呢?比如我在訪問A.com,這時候頁面JavaScript要求我用異步(注意是異步,不是同步,同步就沒有這個問題)請求B.com的一個地址,此時我的瀏覽器就拒絕了這個動作。之前我有點不理解為什么要拒絕,現在我算是明白了,你想,假如你已經登錄了B.com,B.com是信任你的身份的,而A.com想利用你已經登錄了B.com這個狀態,神不知鬼不覺地用頁面JS向B.com發送一個異步請求,獲取到一些你的敏感資料,然后存到自己的服務器上來,這個會有安全性問題,所以瀏覽器是拒絕的,注意,拒絕的主角是瀏覽器,而不是B.com,這樣也不難解釋為什么我自己寫小程序測試以及使用Postman測試都沒問題。

那這個問題應該怎么解決呢?這就需要用到W3C的標准——CORS(Cross-Origin Resource Sharing),這是一項技術標准:https://www.w3.org/TR/cors/,也就是說,現在主流的瀏覽器應當都支持,太舊的瀏覽器就不好說了。瀏覽器把能否跨站異步請求這個決定權交給目標網站,即前面提到的B.com,B說可以就可以,B說不可以就不可以,B可以配置自己的判定規則,比如B說我只允許來自C.com的跨站異步請求,那么A.com仍然是被瀏覽器阻止的。那么,瀏覽器如何知道目標網站是否允許呢?其實是通過幾個HTTP頭的字段來判斷的,之前提供的w3.org的那個連接有具體說明,這里就不展開了。

服務器端如何支持CORS,這個就參考各自的實現吧,自己查查手冊,關鍵字為CORS,EASY。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM