角 POST 请求被 CORS 策略阻止:对预检请求的响应未通过访问控制检查
Posted
技术标签:
【中文标题】角 POST 请求被 CORS 策略阻止:对预检请求的响应未通过访问控制检查【英文标题】:Angular POST request been blocked by CORS policy: Response to preflight request doesn't pass access control check 【发布时间】:2020-01-23 05:52:34 【问题描述】:我已经在后端设置了 cors,我只是不知道为什么我在 url 正确时收到 404 错误。错误是访问来自源“http://localhost:3007”的“http://localhost:3008/api/vehicle”处的 XMLHttpRequest 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态。我还在下面添加了我的 api 跨域。请检查下面的示例代码。这个问题的解决方案是什么?是什么导致了这个问题?我已经在后端设置了 cors,我只是不知道为什么我在 url 正确时收到 404 错误。错误是从源“http://localhost:3007”访问 XMLHttpRequest 在“http://localhost:3008/api/vehicle”已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态。我还在下面添加了我的 api 跨域。请检查下面的示例代码。这个问题的解决方案是什么?是什么导致了这个问题?
有什么想法吗?
Http 发布服务
save(vehicle: Vehicle)
return this.http.post(
CONSTANST.routes.person.save,
Stock: vehicle.Stock,
VIN: vehicle.VIN,
age: vehicle.age,
gender: vehicle.gender,
,
);
路线
const HOST ='http://localhost:3008'
export const CONSTANST =
permissions:,
routes:
authorization:
login: HOST + '/api/app/signin-email',
logout: HOST + '/api/auth/logout'
,
person:
list: HOST + '/api/vehicle',
save: HOST + '/api/vehicle',
,
user:
,
lang:,
session:,
parameters:
;
api跨域请求
if (process.env.NODE_ENV !== 'production')
console.log('------------------------------------------------');
console.log('Notice: Enabling CORS for development.');
console.log('------------------------------------------------');
app.all('*', function (req, res, next)
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET, POST');
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
);
api 路由
app.get('/api/vehicle', keystone.middleware.api, routes.api.vehicle.list);
app.post('/api/vehicle', keystone.middleware.api ,routes.api.vehicle.create);
【问题讨论】:
UI和API的端口不同。因此它将被浏览器安全阻止。 API 必须发送值为*
或 http://localhost:3007
的 Access-Control-Allow-Origin 标头以绕过此
请在此处显示您的后端 cors 配置...
我建议在开发过程中使用 Angular 代理配置(github.com/angular/angular-cli/blob/master/docs/documentation/…)而不是使用完整 URL 直接 API 调用。添加代理后,您无需添加主机,如HOST +
那么解决方案是什么?
@ArifKhan,直接用完整的URL调用api有什么坏处?
【参考方案1】:
在您的情况下,url 可能是正确的,但您的 api 路由中没有为“OPTIONS”请求方法配置处理程序。应该像为 GET 或 POST 请求那样配置它。因此,您在预检请求中收到 404 响应。
app.options('/api/vehicle', keystone.middleware.api ,routes.api.vehicle.create);
但是你不需要用逻辑传递你的回调,因为你会执行你的逻辑两次。
此外,我可以建议您为所有路线执行一个选项处理程序:
app.options('*', someSimpleCallback);
【讨论】:
#Slovy 先生,我有一个问题 是服务器端的问题还是客户端的问题? 服务器端。您正在发送 GET 请求以接收车辆列表和 POST 请求以创建此列表。但是,在您的每个请求之前,浏览器都会在此 url 上发送 OPTIONS 请求,以检查在这些 url 上发送跨域请求的权限。因此,您应该在服务端配置 OPTIONS 请求处理程序:app.options('/api/vehicle', keystone.middleware.api ,routes.api.vehicle.create);【参考方案2】:在我的情况下,我想删除的对象的 id 后面缺少一个斜杠。
如果您将 Django Rest Framework 用于后端,请确保您已设置 ALLOWED_HOSTS。您可能还想使用django-cors-headers 应用程序。
【讨论】:
以上是关于角 POST 请求被 CORS 策略阻止:对预检请求的响应未通过访问控制检查的主要内容,如果未能解决你的问题,请参考以下文章
从源 xxxx 访问 XMLHttpRequest ' 被 CORS 策略阻止:对预检的响应。预检请求不允许重定向
被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:它没有 HTTP OK 状态
Laravel 7 CORS:被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”