Angular 7:对预检请求的响应未通过访问控制检查:请求中不存在“Access-Control-Allow-Origin”标头

Posted

技术标签:

【中文标题】Angular 7:对预检请求的响应未通过访问控制检查:请求中不存在“Access-Control-Allow-Origin”标头【英文标题】:Angular 7 : Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested 【发布时间】:2019-09-07 23:56:01 【问题描述】:

我必须使用 CURD 操作来实现 Angular 应用程序。 API 已经托管在 AWS 中,可以与 Postman 一起正常工作。

但我的 Angular 应用程序越来越

从源“http://localhost:4200”访问位于“https://acp56df5alc.execute-api.us-east-”的 XMLHttpRequest1.amazonaws.com/ams/getmember' 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。

我的代码如下,

http_GET(actionUrl: string): Observable<any> 
        const httpOptions = 
            headers: new HttpHeaders(
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*',
                'Access-Control-Allow-Credentials': 'true',
                'Access-Control-Allow-Headers': 'Content-Type',
                'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE',
                'key': 'x-api-key',
                'value': 'NNctr6Tjrw9794gFXf3fi6zWBZ78j6Gv3UCb3y0x',

            )
        ;
        return this.http.get<any>(this.baseUrl + actionUrl, httpOptions).pipe(
            (response => 
                return response;
            ));
    

我已经努力解决这个问题。但是需要一些帮助

【问题讨论】:

我实际上只是收到了这个确切的错误消息(除了粗略的域),并且应用程序之前运行过,所以知道它不应该是一个真正的 CORS 问题,结果我有重命名服务器上的目录,但未重命名 web.config 文件中的目录。可能值得一看,看看您是否还有其他可能导致此误报错误消息的失败。 【参考方案1】:

我遇到了同样的cors 问题,并尝试了所有设置Access-Control-Allow-Origin * 的建议方法,但均未成功。 后来发现两个问题:

    我通过POST 发送的data format 请求格式不正确。 服务器无法处理从发布请求接收到的空参数。

原始请求:

return this.http.post(API_URL + 'customer/login',
  email: email, password: password, headers: headers
)

在我使用 JSON.stringify() 包装帖子数据后工作

return this.http.post(API_URL + 'customer/login',
      JSON.stringify(email: email, password: password), headers: headers
    )

【讨论】:

【参考方案2】:

所有/大多数这些标头都需要在服务器端定义(无论在 AWS 上托管 API 的什么)...而不是客户端。

 headers: new HttpHeaders(
                'Content-Type': 'application/json',
                'Access-Control-Allow-Origin': '*',
                'Access-Control-Allow-Credentials': 'true',
                'Access-Control-Allow-Headers': 'Content-Type',
                'Access-Control-Allow-Methods': 'GET,PUT,POST,DELETE',
                'key': 'x-api-key',
                'value': 'NNctr6Tjrw9794gFXf3fi6zWBZ78j6Gv3UCb3y0x',
  ...

邮递员工作的最可能原因是它直接发送 GET 请求。您发送的是一个复杂的请求,称为“飞行前”,它会导致在实际 GET 之前发送“选项”请求。这是远程端不允许的。

【讨论】:

这些属性应该在哪里定义?

以上是关于Angular 7:对预检请求的响应未通过访问控制检查:请求中不存在“Access-Control-Allow-Origin”标头的主要内容,如果未能解决你的问题,请参考以下文章

对预检请求的响应未通过访问控制(Angular 2 - Web Api)

对预检请求的响应未通过访问控制检查 - Angular 5 + JWT OAuth

Angular 6 - 对预检请求的响应未通过访问控制检查:没有“Access-Control-Allow-Origin”标头

Angular2对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头

cors(cors 策略:对预检请求的响应未通过访问控制检查)角度 7 中的错误

CORS 策略:对预检请求的响应未通过访问控制检查:它没有 HTTP ok 状态