您好,登錄后才能下訂單哦!
什么是CORS?
默認情況下,為預防某些而已行為,瀏覽器的XHR對象只能訪問來源于同一個域中的資源。但是我們在日常實際開發中,常常會遇到跨域請求的需求,因此就出現了一種跨域請求的方案:CORS(Cross-Origin Resource Sharing)跨域資源共享。
CORS背后的原理是:使用自定的HTTP頭部與服務器進行溝通,從而由服務器決定響應是否成功。
了解下同源策略
為什么要跨域限制
跨域決解方案
CORS(跨域資源共享)
CORS簡單使用
之前說得CORS跨域,嗯嗯,后端設置Access-Control-Allow-Origin:*|[或具體的域名]就好了;
第一次嘗試:
app.use(async(ctx,next) => { ctx.set({ "Access-Control-Allow-Origin": "http://localhost:8088" })
發現有些請求可以成功,但是有些還是會報錯:
請求被同源策略阻止,預請求的響應沒有通過檢查:http返回的不是ok?
并且發現發送的是OPTIONS請求:
發現:CORS規范將請求分為兩種類型,一種是簡單請求,另外一種是帶預檢的非簡單請求
簡單請求和非簡單請求
瀏覽器發送跨域請求判斷方式:
什么是簡單請求
1、請求方法是如下之一:
2、所有的Header都只包含如下列表中(沒有自定義header):
除此之外都是非簡單請求
CORS非簡單請求配置須知
正如上圖報錯顯示,對于非簡單請求,瀏覽器會先發送options預檢,預檢通過后才會發送真是的請求;
發送options預檢請求將關于接下來的真實請求的信息給服務器:
Origin:請求的源域信息
Access-Control-Request-Method:接下來的請求類型,如POST、GET等
Access-Control-Request-Headers:接下來的請求中包含的用戶顯式設置的Header列表
服務器端收到請求之后,會根據附帶的信息來判斷是否允許該跨域請求,通過Header返回信息:
Access-Control-Allow-Origin:允許跨域的Origin列表
Access-Control-Allow-Methods:允許跨域的方法列表
Access-Control-Allow-Headers:允許跨域的Header列表,防止遺漏Header,因此建議沒有特殊需求的情況下設置為*
Access-Control-Expose-Headers:允許暴露給JavaScript代碼的Header列表
Access-Control-Max-Age:最大的瀏覽器預檢請求緩存時間,單位為s
CORS完整配置
koa配置CORS跨域資源共享中間件:
const cors = (origin) => { return async (ctx, next) => { ctx.set({ "Access-Control-Allow-Origin": origin, //允許的源 }) // 預檢請求 if (ctx.request.method == "OPTIONS") { ctx.set({ 'Access-Control-Allow-Methods': 'OPTIONS,HEAD,DELETE,GET,PUT,POST', //支持跨域的方法 'Access-Control-Allow-Headers': '*', //允許的頭 'Access-Control-Max-Age':10000, // 預檢請求緩存時間 // 如果服務器設置Access-Control-Allow-Credentials為true,那么就不能再設置Access-Control-Allow-Origin為*,必須用具體的域名 'Access-Control-Allow-Credentials':true // 跨域請求攜帶身份信息(Credential,例如Cookie或者HTTP認證信息) }); ctx.send(null, '預檢請求') } else { // 真實請求 await next() } } } export default cors
現在不管是簡單請求還是非簡單請求都可以跨域訪問啦~
跨域時如何處理cookie
cookie:
問題:
決解:
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。