去年我在作一個項目,是關於標籤打印的,它就是一個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。服務器