reactjs - 达到速率限制时收到 CORS 错误而不是预期的 429 响应
问题描述
在我的后端中,我在 .net 核心实体框架后端中使用 AspNetCoreRateLimit 包实现了 IpRateLimit 中间件。当 IP 地址 x 在特定时间进行 y 调用时,它会被阻塞一段时间,并且后端应该返回 429 错误,这在使用邮递员进行测试时可以正常工作。但是当我使用 axios 发出请求时,由于 ip 速率限制器应该被阻止,我收到 axios 错误:
"Access to XMLHttpRequest at 'https://localhost:44372/api/Users/Login/' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource."
"POST https://localhost:44372/api/Users/Login/ net::ERR_FAILED"
收到此错误后,我添加了所需的标头,但并没有改变结果。对我的后端的其他 axios 请求(也包括发布、放置和删除)工作正常,但是当 IP 速率限制器命中时,我只会收到 cors 错误。
我在我的应用程序中实现了限制器,如下面的教程: https ://edi.wang/post/2019/6/16/ip-rate-limit-for-aspnet-core
响应 axios 请求:
async function buildPostAndFetch(url, param, header) {
const finalurl = `${BASE_URL}${url}`;
return axios.post(finalurl, param, {headers:{"Access-Control-Allow-Origin": "*"}})
.then(res => {
response(res);
return res.data ? res.data : true;
})
.catch(err => {
handleError(err);
return false;
})
}
handleError() {
const handleError = err => {
setError(true);
if(err.request?.status === 0) {
console.log("*********************************************")
console.log(err.request);
console.log("*********************************************")
// throw new Error("API is currently offline or you are not connected to the internet:(");
} else if(err.response.status === 429) {
console.log("*********************************************")
console.log(err.response);
console.log("*********************************************")
}
}
}
当请求和限制器命中时,我总是进入 err.request.status === 0 路径。
解决方案
默认情况下,大多数服务器系统/运行时不会将应用程序集标头添加到4xx
响应中5xx
,而只会将它们添加到2xx
成功响应中,并且可能会添加到3xx
重定向中。
因此,您可能需要进行显式配置以强制将标头添加到 4xx 响应中,以便该429
响应以标头结尾Access-Control-Allow-Origin
。
例如,在 Apache 和 nginx 中,这是通过将always
关键字添加到 header-setting 指令来完成的。也许你的服务器系统有一些类似的东西。
您收到 CORS 错误,因为该429
错误没有Access-Control-Allow-Origin
标题。
推荐阅读
- python - Can't make a hitbox for my Ping Pong pygame
- java - 发生此异常后,所有其他请求均失败“具有相同标识符值的不同对象已与会话关联”
- python - 熊猫,分组后数据为空时保留列?
- javascript - 如何从Javascript(React Native)中的API响应中过滤过去5年(最近一年的数据,如2015、2015、2017、2018、2019年数据)数据
- python - 如何将二进制数据恢复到音频文件中?
- xml - 对于元素 {http://www.xbrl.org/2003/linkbase}footnoteLink 没有带有 @XmlElementDecl 的 ObjectFactory
- c# - 滚动 DataGrid 后使用转换器时,转换器参数“值”为空
- powershell - CSV 文件,更改单元格值
- android - 使用 firebase MLkit 的文本识别仅调用 OnFailure() 方法。为什么?
- python - 如何根据两个条件从数据集中过滤掉一些行?