当Axios跨域请求遇上request⾃定义headers之错误排坑

文章讲述了在ERP项目中遇到的不同页面请求同一接口但结果不同的问题。问题根源在于axios请求触发了预检请求(CORS),而接口未支持OPTIONS方法和特定请求头。解决方案包括更新后端Allow-Methods,添加Access-Control-Allow-Origin和Access-Control-Allow-Headers来允许跨域请求。

坑之背景:
ERP项⽬中不同⻚⾯请求同⼀个接⼝/trace/item/staff/list(只有线上有此接⼝,其他灰度没发,直接请求到这
⾥, ⼀个字,⽆语)参数⼀致, 服务端配置⼀致

1、商品操作⽇志
使⽤jQuery 的$.ajax的⽅式请求, 响应正常

2、交易 --> 发货⽐例 --> 变更记录
使⽤axios.get⽅式,就⼀直报错,⼀直报错,⼀直报错,Network
Erorr

图片1

坑之分析:
为什么相同的相同的请求,不同的⽅式,结果会不⼀样?这个时候去怀疑后端配置不对,显然有点耍⽆赖。没有办法,冷静下来想想, axios
请求⽅式有问题, 那⼀定是它做了什么不为⼈知的事情,那我们从这个往下查。

#1. 由于ERP特定要求, 前端请求会去改写请求头,在header⾥⾯添
就是这个操作会导致触发Request Method为OPTIONS的预检请求
(preflight)。⽽$.ajax是不会触发这个动作。后端该请求的Allow-
Method⾥⾯不⽀持OPTIONS⽅式,就出现了上图中的预检请求不通过
详⻅:https://www.jb51.net/article/193303.htm

图片2
#2. 让ERP后端这个接⼝⽀持OPTIONS⽅式,然后再测再报错

图片3

#3. ngnix跨域设置没有加域名,添加跨域域名,再测再报错

图片4
原来preflight请求还要校验请求头, 那就让后端加上呗。nginx⾥⾯加或后端代码⾥⾯加,之⼀即可
Access-Control-Allow-Headers 添加CompanyId,TrackId

#4. 然后就没有然后了, 请求终于通了。。。。
图片5

总结: 要解决此类问题拢共分三步(某个特定请求级别)
1. Allow-Method 允许 OPTIONS⽅式
2. Access-Control-Allow-Origin 对其他各灰度环境开放
3. Access-Control-Allow-Headers 添加CompanyId,TrackId等需要

允许通过的字段

在使用 Axios 进行请求时,设置请求头需要特别注意浏览器的同源策略和预检请求(OPTIONS)的处理机制。 在请求中,如果请求头中包含自定义的头部字段(如 `Authorization` 或 `token`),浏览器会先发送一个 `OPTIONS` 请求以确认服务器是否允许该请求。如果后端没有正确处理这个 `OPTIONS` 请求,可能会导致主请求被拦截,从而出现 404 或 500 错误。[^1] 为了在 Axios 中设置请求请求头,可以通过在请求配置中指定 `headers` 属性来实现。例如: ```javascript axios.get('https://api.example.com/data', { headers: { 'Authorization': 'Bearer your_token_here', 'X-Custom-Header': 'custom_value' } }) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` 在某些情况下,为避免请求头被浏览器拦截,可以将部分请求头参数改用 `params` 参数传递,作为 URL 查询参数发送,从而绕过预检请求的限制: ```javascript axios({ url: 'https://api.example.com/data', method: 'get', params: { token: 'your_token_here' } }).then(res => { console.log(res.data); }); ``` 此外,若使用 Axios请求拦截器,可以动态添加请求头,确保所有请求都带上必要的信息: ```javascript axios.interceptors.request.use(config => { config.headers['Authorization'] = 'Bearer your_token_here'; return config; }, error => { return Promise.reject(error); }); ``` 需要注意的是,请求时,后端服务器应配置 `Access-Control-Allow-Headers` 以允许客户端发送特定的请求头字段,例如: ```java response.addHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Authorization, Origin, Accept, X-Requested-With, Content-Type"); ``` 这样可以确保浏览器不会因为请求头中包含非简单字段而阻止请求的发送。[^4] ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值