var koa = require('koa'); var app = new koa(); var router = require('koa-router')(); // CORS是一個W3C標准,全稱是"跨域資源共享"(Cross-origin resource sharing)。 // 下面以koa2-cors為例, const cors = require('koa2-cors'); // 具體參數我們在后面進行解釋 app.use(cors({ origin: function (ctx) { if (ctx.url === '/test') { return "*"; // 允許來自所有域名請求 } return 'http://localhost:8080'; / 這樣就能只允許 http://localhost:8080 這個域名的請求了 }, exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'], maxAge: 5, credentials: true, allowMethods: ['GET', 'POST', 'DELETE'], allowHeaders: ['Content-Type', 'Authorization', 'Accept'], })) router.post('/', async function (ctx) { ctx.body = '恭喜 __小簡__ 你成功登陸了' }); app .use(router.routes()) .use(router.allowedMethods()); app.listen(3000);
2、下面我們在http://localhost:8080發送請求進行測試
this.$axios.post('http://172.16.186.50:3000/', {}) .then((response) => { console.log(response) }) .catch(function (error) { console.log(error); });
3、下面我們以具體的請求頭信息解釋上面的代碼,也就是cors具體的實現過程
// 我們可以用下面的中間件理解app.use(cors({})) app.use(async (ctx, next) => { // 允許來自所有域名請求 ctx.set("Access-Control-Allow-Origin", "*"); // 這樣就能只允許 http://localhost:8080 這個域名的請求了 // ctx.set("Access-Control-Allow-Origin", "http://localhost:8080"); // 設置所允許的HTTP請求方法 ctx.set("Access-Control-Allow-Methods", "OPTIONS, GET, PUT, POST, DELETE"); // 字段是必需的。它也是一個逗號分隔的字符串,表明服務器支持的所有頭信息字段. ctx.set("Access-Control-Allow-Headers", "x-requested-with, accept, origin, content-type"); // 服務器收到請求以后,檢查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后,確認允許跨源請求,就可以做出回應。 // Content-Type表示具體請求中的媒體類型信息 ctx.set("Content-Type", "application/json;charset=utf-8"); // 該字段可選。它的值是一個布爾值,表示是否允許發送Cookie。默認情況下,Cookie不包括在CORS請求之中。 // 當設置成允許請求攜帶cookie時,需要保證"Access-Control-Allow-Origin"是服務器有的域名,而不能是"*"; ctx.set("Access-Control-Allow-Credentials", true); // 該字段可選,用來指定本次預檢請求的有效期,單位為秒。 // 當請求方法是PUT或DELETE等特殊方法或者Content-Type字段的類型是application/json時,服務器會提前發送一次請求進行驗證 // 下面的的設置只本次驗證的有效時間,即在該時間段內服務端可以不用進行驗證 ctx.set("Access-Control-Max-Age", 300); /* CORS請求時,XMLHttpRequest對象的getResponseHeader()方法只能拿到6個基本字段: Cache-Control、 Content-Language、 Content-Type、 Expires、 Last-Modified、 Pragma。 */ // 需要獲取其他字段時,使用Access-Control-Expose-Headers, // getResponseHeader('myData')可以返回我們所需的值 ctx.set("Access-Control-Expose-Headers", "myData"); await next(); })
4、理解的上面的代碼,估計你也能猜到app.use(cors({}))里面的配置信息了。當然還有其他可選的信息,具體設置並無多大差別,在這就不多解釋了。
5、注:我們還可以通過在前端配置代理的方式來實現跨域請求。