koa2给某条特定的url设置cors后,前端ajax自定义头部后就无法跨域,去掉头部就能跨域

发布于 2022-09-07 12:12:43 字数 2292 浏览 12 评论 0

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);
        });

后台把所有的接口都设置成cors,前端是可以自定义头部的。

但是如果我只是让其中一个接口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')

这时前端设置自定义头部,就会报错
图片描述

说没有No 'Access-Control-Allow-Origin' header,但是我已经设置过Access-Control-Allow-Headers了。

如果前端把自定义头部去掉,这时又能跨域成功

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

求解决方法

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

安静被遗忘 2022-09-14 12:12:43

那是因为你代码1的所有包括options请求 浏览器在非简单请求之前都会预检 而后面那段代码你并没有处理它 所以就直接405不会发送post请求

花开半夏魅人心 2022-09-14 12:12:43

已找到解决方法
还需处理options请求

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;
});

至于之前,没有设置请求头就可以跨域的问题,原因是不设置请求头,我当前的跨域请求是个简单请求,不会预先发送一个options,所以仍然跨域成功了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文