場景:
前端是調用http://XXXXX:1808下的接口,但是網關代理后映射端口為18021,這導致前端頁面接口顯示也是18021,請求后端接口時需要跨域。
解決:
跨域問題:是瀏覽器自帶的保證同源的安全策略,即:該頁面下的js請求只能是同協議,同IP,同端口(CROS標准),其中有一個不同,就是跨域問題。
后端:使用.net core,需要在Startup.cs的Configure函數中添加以下:
app.UseCors(builder => builder.AllowAnyMethod() //允許任何方法 //.AllowAnyOrigin() .SetIsOriginAllowed(_ => true) //允許任何源 .AllowAnyHeader() .AllowCredentials());
前端:用axios解決的,代碼如下:
axios .post(url, fd, { headers: { "Access-Control-Allow-Origin": "http://XXXXX:1808", "Access-Control-Allow-Methods": "*", "Content-Type": "multipart/form-data", "Access-Control-Allow-Headers": "TOKEN,content-type", "TOKEN": cookies.getToken() } })
其中,Access-Control-Allow-Headers是需要傳的自定義的header。這里有一個自定義的Header。
Access-Control-Allow-Methods可以填的詳細一點,值包括:POST, GET, OPTIONS等,其中的OPTIONS是必需的。因為跨域是非簡單請求,它會發兩次請求。第一次是OPTIONS,就是預檢,用來向后端詢問是否允許跨域。第二次才是把參數帶進去。
Access-Control-Allow-Origin是要跨去哪里,即目標源。
如果出現ERR_CONNECTION_REFUSED的問題,可能是Access-Control-Allow-Methods沒加OPTIONS。
參考:
https://www.cnblogs.com/lishanlei/p/8823823.html
https://blog.csdn.net/longgeqiaojie304/article/details/85270839