HTTP協議本身是沒有跨域請求的設置的,跨域請求的限制是瀏覽器為了安全考慮加上去的。
實際上,瀏覽器對於HTTP請求是直接發送給server
瀏覽器提供了2種方式來突破跨域請求的限制,
- 在sever返回的Response Head中添加Access-Control-Allow-Origin
- 瀏覽器不限制script標簽、img標簽、link標簽的跨域請求。
對於現在的突破跨域請求的方式,比如使用JSONP方式,它的底層原理就是使用script標簽。
對於一些可控的跨域請求,通常我們使用Access-Control-Allow-Origin頭。
但是,使用這個頭也有一些限制:
- 請求方法的限制: 默認的突破跨域請求的限制只支持GET、POST、HEAD方法,使用其他方法使用方式預請求。
- 自定義的頭部信息: 默認的突破跨域限制的請求中,自定義的頭部信息會被屏蔽掉,如果需要使用自定義的頭部信息需要發送預請求。
- Content-Type: 默認的突破跨域限制的請求的response格式也有限制,只支持text/plain、multipart/form-data、application/x-www-form-urlencoded,如果需要其他格式,需要發送預請求。
預請求:
由於需要突破CORS跨域請求的限制,瀏覽器一般需要發送預請求。預請求就是為了驗證是否可以發送跨域請求而先發送的,它的method是OPTIONS。得到200的響應后,如果在Response Head中設置了
Access-Control-Allow-Headers、Access-Control-Allow-Methods類型的值,瀏覽器拿到這些頭部信息就會和真正需要發送的請求的頭部進行比對,如果存在的話就可以發送真正的請求了。不然會報error。
可以設置Access-Control-Max-Age時間,在這個時間內再次發起相同的跨域請求時就不需要預請求了。