允許瀏覽器跨域訪問web服務端的解決方案


  今天和同事探討了前后端如何真正實現隔離開發的問題,如果前端單獨作為服務發布,勢必會涉及到無法直接調用后端的接口的問題,因為瀏覽器是不允許跨域提交請求的。

      所謂跨域訪問,就是在瀏覽器窗口,和某個服務端通過某個協議+域名+端口號建立了會話的前提下,去使用與這三個屬性任意一個不同的源提交了請求,比如:打開新窗口,iframe,xmlhttprequest,那么瀏覽器就認為你是跨域了,違反了瀏覽器的同源策略。 

  解決此問題,w3c標准中,有針對跨域請求的規范:

  在響應頭中帶上Access-Control-Allow-Origin,值是你允許跨域訪問的源,比如http://www.baidu.com,注意這里只支持*(表示所有源)號或者某個源,不支持多個源,如果要實現多個源,可以自己包裝一個集合,對每次的請求在集合中判斷是否存在,如存在,就放到響應頭中來;

  使用Access-Control-Allow-Methods 限制允許跨域訪問的http方法類型,多個以逗號隔開,比如:POST,GET,OPTIONS

  使用Access-Control-Allow-Headers,限制允許跨域訪問的http頭,包含這里設置的頭,才允許跨域訪問 比如:foo-x

  對於客戶端在發送請求的時候,瀏覽器會檢測如果本次請求是一個非簡單的跨域請求,就會先發送一個OPTIONS的請求到后台預檢一下是否支持本源的跨域,如果支持,后台就用上面提到的幾個響應頭信息告訴瀏覽器,接着瀏覽器會發送真正的請求到后台,否則請求將不會得到結果,瀏覽器會報違反同源策略的警告。

  關於簡單跨域請求和非簡單跨域請求解釋如下:

  CORS(Cross Origin Resourse-Sharing),中文意思是跨域資源共享,定義了兩種跨域請求,簡單跨域請求和非簡單跨域請求。當一個跨域請求發送簡單跨域請求包括:請求方法為HEAD,GET,POST;請求頭只有4個字段,Accept,Accept-Language,Content-Language,Last-Event-ID;如果設置了Content-Type,則其值只能是application/x-www-form-urlencoded,multipart/form-data,text/plain,所以,我們設置一下content-type為其它的值,比如application/json,此次請求就會被認為是非簡單跨域請求,瀏覽器就會提交預檢請求了。

  


免責聲明!

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



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