在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ koa2給某條特定的url設(shè)置cors后,前端ajax自定義頭部后就無(wú)法跨域,去

koa2給某條特定的url設(shè)置cors后,前端ajax自定義頭部后就無(wú)法跨域,去掉頭部就能跨域

app.js

const Koa = require('koa');
const Router = require('koa-router');
const router = new Router();
const app = new Koa();



router.all('*',function (ctx, next) {
    ctx.set('Access-Control-Allow-Origin', '*');
    ctx.set('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , myheader');
    ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');

    next();
  });


router.post('/api/test/', (ctx, next) => {
    ctx.body = {
        status: 'success'
    }
});

router.post('/api/test2/', (ctx, next) => {
    ctx.body = {
        status: 'success'
    }
});



app.use(router.routes()).use(router.allowedMethods());



app.listen(8089);


console.log('server start at 8089')

前端自定義頭部myheader

axios.post(`http://localhost:8089/api/test`, null, { headers: { 'myheader': 'test' }})
        .then(response => {
            console.log(response.data);
        });

后臺(tái)把所有的接口都設(shè)置成cors,前端是可以自定義頭部的。

但是如果我只是讓其中一個(gè)接口cors

const Koa = require('koa');
const Router = require('koa-router');
const router = new Router();
const app = new Koa();



router.post('/api/test/', (ctx, next) => {
    ctx.set('Access-Control-Allow-Origin', '*');
    ctx.set('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , myheader');
    ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
    ctx.body = {
        status: 'success'
    }
});

router.post('/api/test2/', (ctx, next) => {
    ctx.body = {
        status: 'success'
    }
});



app.use(router.routes()).use(router.allowedMethods());



app.listen(8089);


console.log('server start at 8089')

這時(shí)前端設(shè)置自定義頭部,就會(huì)報(bào)錯(cuò)
圖片描述

說(shuō)沒(méi)有No 'Access-Control-Allow-Origin' header,但是我已經(jīng)設(shè)置過(guò)Access-Control-Allow-Headers了。

如果前端把自定義頭部去掉,這時(shí)又能跨域成功

// 正??缬?axios.post(`http://localhost:8089/api/test`, null)
        .then(response => {
            console.log(response.data);
        });

求解決方法

回答
編輯回答
慢半拍

已找到解決方法
還需處理options請(qǐng)求

router.options('/api/test/', (ctx, next) => {
    ctx.set('Access-Control-Allow-Origin', '*');
    ctx.set('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , myheader');
    ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
    ctx.status = 200;
    return;
});

至于之前,沒(méi)有設(shè)置請(qǐng)求頭就可以跨域的問(wèn)題,原因是不設(shè)置請(qǐng)求頭,我當(dāng)前的跨域請(qǐng)求是個(gè)簡(jiǎn)單請(qǐng)求,不會(huì)預(yù)先發(fā)送一個(gè)options,所以仍然跨域成功了。

2017年2月13日 17:19
編輯回答
吢涼

那是因?yàn)槟愦a1的所有包括options請(qǐng)求 瀏覽器在非簡(jiǎn)單請(qǐng)求之前都會(huì)預(yù)檢 而后面那段代碼你并沒(méi)有處理它 所以就直接405不會(huì)發(fā)送post請(qǐng)求

2018年3月9日 17:24