使用koa開發(fā)想要開啟 cors 非常簡單杉编,已經(jīng)有對(duì)應(yīng)的庫:@koa/cors喉前。
雖然庫的readme沒有具體介紹具體的用法,但是我們可以通過閱讀測試用例知道可以傳什么參數(shù)王财,什么類型卵迂。
基本用法
const cors = require('@koa/cors')
app.use(cors());
只需要兩行,接口就會(huì)在返回?cái)?shù)據(jù)的時(shí)候帶上Access-Control-Allow-Origin
響應(yīng)頭绒净。默認(rèn)允許所有請求方式跨域见咒,Access-Control-Allow-Origin
默認(rèn)為*
。
攜帶cookies
為了安全考慮挂疆,攜帶cookies的跨域請求只允許Access-Control-Allow-Origin
為單一域名改览,即只支持一個(gè)域名在請求的時(shí)候攜帶cookies。且需要帶上響應(yīng)頭Access-Control-Allow-Credentials
對(duì) @koa/cors 添加配置origin
和credentials
:
const cors = require('@koa/cors')
app.use(cors({
origin: 'http://koa.com', // 前端地址
credentials: true
}));
同時(shí)缤言,前端要發(fā)起攜帶cookies的跨域請求宝当,需要設(shè)置XMLHttpRequest
的withCredentials
為true
,如果你是使用axios
胆萧,只需要在請求配置里加上一句withCredentials: true
庆揩,請看例子:
export const upload = (requestParams) => {
return axios({
method: 'post',
url: 'http://localhost:8000/api/admin/upload',
data: requestParams,
withCredentials: true
})
}
這樣前端(http://koa.com)就可以向后端(http://localhost:8000)發(fā)送請求了俐东。
多域攜帶cookies發(fā)送請求
如果你的前端地址只有一個(gè),給@koa/cors
的origin
添加一個(gè)域名就能滿足需求订晌,如果需要支持跨域的域名有多個(gè)呢虏辫?
通過觀察@koa/cors
的單元測試用例,可以發(fā)現(xiàn)origin
是支持用函數(shù)的方式傳入的锈拨。這樣我們就可以維護(hù)一個(gè)域名數(shù)組砌庄,判斷請求地址是否在域名數(shù)組內(nèi),就能知道是否要對(duì)請求地址提供攜帶cookies請求支持了奕枢。
要想知道發(fā)起請求的前端地址娄昆,可以使用ctx.request.header.origin
。注意ctx.request.header.origin
和ctx.request.origin
是不同的缝彬。ctx.request.origin
是接口域名稿黄,ctx.request.header.origin
是發(fā)起請求的頁面域名。