has been blocked by CORS policy: Request header field aaa is not allowed by Access-Control-Allow-Hea

Vue项目中使用axios作为http请求库,我想在get请求中添加一个自定义的请求头,结果在我请求数据的时候,就报出了跨域的问题.

给http请求添加自定义的请求头参数很常用,如我给我的请求添加token给服务端验证请求的合法性等,我在我的项目中给所有的get请求添加了一个aaa参数,结果我在使用get请求数据的时候,报出了跨域问题的异常信息.报的信息如下:

Access to XMLHttpRequest at 'http://localhost:3004/users' from origin 'http://localhost:8080' has been blocked by CORS policy: Request header field aaa is not allowed by Access-Control-Allow-Headers in preflight response.

简单说一下我的场景,我的一个vue文件中,发送了一个get请求,请求服务器上的用户信息列表,代码如下:

<table>
    <tr v-for="(item,id) in userList" :key="id">
        <td>{{item.id}}</td>
        <td>{{item.username}}</td>
    </tr>
</table>
created() {
    // 获取用户列表,在下面的methods中定义的方法
    this.getUserName();
},

// methods中定义的获取用户信息列表的方法
methods: {
    // 获取用户信息
    getUserName() {
        this.axios.get("http://localhost:3004/users").then(res => {
            this.userList = res.data.user;
        });
    }
}

这里Vue中的数据渲染没有什么问题,然后我想在我发起get请求的时候,向服务器发送一个自定义的请求头.我就通过axios添加了一个公共的请求参数:

axios.defaults.headers.get['aaa'] = "ccc";

我的代码量不大,就直接把axios的一些配置直接写在了main.js中了.

服务端跨域问题的处理

服务端我是koa写的,通过cors处理的跨域问题.

// 引入koa
const Koa = require("koa");

//引入koa2-cors
const cors = require("koa2-cors");

// 通过use函数加载koa2-cors并加入cors的一些配置
app.use(cors({
    origin: (ctx) => {
        return "*";
    },
    exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
    maxAge: 5,
    credentials: true,
    allowMethods: ['GET', 'post', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'],
    allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
    AccessControlAllowHeaders: "*"
}));

// 设置router并处理客户端发送过来的get请求
router.get("/users", async (ctx) => {
    let getUserListSql = "select * from user";
    let getSchoolListSql = "select * from school";
    let userList = await query(getUserListSql);
    let schoolList = await query(getSchoolListSql);
    ctx.body = {
        user: userList,
        school: schoolList
    };
});

我通过pm2管理的node服务,我把服务跑在了3004端口,这里都是没有任何问题的(这里我们暂且不讨论上面的代码的合理性,这里只是做demo的,不是在真是的项目中,代码的组织是不严谨的).但是我在客户端发起请求的时候,就报错了:报错信息就是这样的:

Access to XMLHttpRequest at 'http://localhost:3004/users' from origin 'http://localhost:8080' has been blocked by CORS policy: Request header field aaa is not allowed by Access-Control-Allow-Headers in preflight response.

这里的报错是跨域问题,但我在没有添加自定义请求头的时候是没有任何问题的,所以这里的问题应该就是和自定义的请求头有关系.后来经过查找资料,原来浏览器在发送带有自定义的请求头时,浏览器会先向服务器发送OPTIONS预检请求,探测该请求服务端是否允许自定义跨域字段.如果允许,则继续执行请求,如果不允许,则返回错误信息提示错误.

看到这些信息,然后回头看cors的配置信息,其中有allowHeaders配置项,表示服务器支持的请求头信息字段,于是我就在默认的配置后面加上了我在客户端自定义添加的aaa字段,cors的配置就变成如下:

app.use(cors({
    origin: (ctx) => {
        return "*";
    },
    exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
    maxAge: 5,
    credentials: true,
    allowMethods: ['GET', 'post', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'],
    allowHeaders: ['Content-Type', 'Authorization', 'Accept','aaa'],
    AccessControlAllowHeaders: "*"
}));

只在allowHeaders配置项中添加了一个aaa字段,别的地方没有任何改动,然后问题解决了.

服务端获取请求头信息

ctx.headers["aaa"];

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CORS(跨源资源共享)是一种安全机制,用于限制从一个源加载的资源如何与来自另一个源的资源进行交互。当浏览器检测到请求的源、协议或端口与当前文档不同时,就会发出跨域请求。在这种情况下,服务器必须在响应中添加特定的CORS头部,以允许浏览器访问资源。如果请求头部中包含未经允许的字段,服务器将返回一个CORS错误,其中包含“has been blocked by CORS policy: Request header field authorization is not allowed by Access-Control-Allow-Headers in preflight response.”的错误消息。 解决这个问题的方法是在服务器端添加允许请求头部的字段。在引用中提供了一个PHP的例子,其中添加了三个头部:Access-Control-Allow-Origin、Access-Control-Allow-Headers和Access-Control-Request-Headers。Access-Control-Allow-Origin头部指定允许访问资源的源,Access-Control-Allow-Headers头部指定允许的请求头部字段,Access-Control-Request-Headers头部指定浏览器在实际请求中发送的请求头部字段。 如果你使用的是axios或ajax进行请求,可以在请求头部中添加Authorization字段,如下所示: ```javascript axios({ method: 'get', url: 'http://example.com', headers: { 'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json' } }) ``` 在这个例子中,我们添加了Authorization和Content-Type字段到请求头部中。如果服务器允许这些字段,请求将被成功处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值