当前位置: 首页 > 知识库问答 >
问题:

为什么Axios似乎没有接收到access-control-request-*头,即使它们正在发送?

公良天逸
2023-03-14

不幸的是,即使我在后端配置了所有的访问控制头(在AWS Api网关中),我仍然得到错误

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://example.com/internal/role. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

现在,我遇到的问题是,当用Postman对我的一个资源调用OPTIONS调用时(不是作为一个预先调用,而是作为一个“独立”调用),我收到了正确的访问控制头。但是,当用Axios发出相同的请求时,我似乎没有收到那些头,这使我认为这可能是Axios的问题。

以下是我在拨打OPTIONS电话时收到的邮递员邮件头:

 - Date: Fri, 26 Jun 2020 12:01:18 GMT
 - Content-Type: application/json
 - Content-Length: 0
 - Connection: keep-alive
 - x-amzn-RequestId: <some ID>
 - Access-Control-Allow-Origin: https://example-gui.com
 - Access-Control-Allow-Headers: Origin,Accept,Content-Type,X-Amz-Date,Authorization,X-Api-Key,x-requested-with
 - x-amz-apigw-id: <some ID>
 - Cache-Control: max-age=600, s-maxage=600, proxy-revalidate
 - Access-Control-Allow-Methods: OPTIONS,POST
 - Access-Control-Allow-Credentials: true
 - cache-control: max-age=600, s-maxage=600, proxy-revalidate
 - content-length: 0
 - content-type: application/json

不幸的是,我没有关于实际POST调用返回的数据的信息,因为它只是抛出提到的异常。

Postman调用只是对相应URL的一个基本调用,使用OPTIONS方法,它只有一个额外的头(授权),所以我不打算进一步讨论。

Axios调用源自URL https://example-gui.com/#/,如下所示:

const fullResponse = (response: AxiosResponse) => response;

const backendRequests = {
   ...
  options: (url: string, header: {}) =>
    axios.options(url, header).then(fullResponse),
  ...
};

const loginRequests = {
  getUserRole: (accesstoken: string) =>
    backendRequests.options(
      "https://example.com/internal/role",
      { Authorization: `Bearer ${accesstoken}` }
    ),
};
try {
  await agent.loginRequests
    .getUserRole(this.accessToken)
    .then((response) => {
      console.log(response); // <-- Printing the results
      <...>
    });
} catch (error) {
  console.log(error);
}

我怎样才能在考虑到所有这些信息的情况下设法通过同源政策呢?

共有1个答案

罗凯
2023-03-14

是否检查了是否正在从Axios发送access-control-allow-headersheader下从后端服务请求的所有头。可以将头的数量限制为access-control-allow-headers:Accept,content-type并检查CORS是否工作。

如果Access-Control-Allow-Origin使用*,则不能使用凭据。您必须指定协议+域+端口。

Access-Control-Allow-Origin通配符子域、端口和协议与凭据的源资源共享使用*太开放,会妨碍凭据的使用。因此进一步将http://domain:port设置为允许起源头。

 类似资料:
  • HTML: 当我打开localhost:8080/races时,我可以完全看到JSON:

  • Access-Control-Request-Method发出请求时报头用于预检请求让服务器知道哪些 HTTP 方法的实际请求时将被使用。这个头是必要的,因为预检请求始终是一个OPTIONS,并且不使用与实际请求相同的方法。 Header type Request header Forbidden header name yes 语法 Access-Control-Request-Method:

  • Access-Control-Request-Headers发出请求时报头用于预检请求让服务器知道哪些 HTTP 头的实际请求时将被使用。 Header type Request header Forbidden header name yes 语法 Access-Control-Request-Headers: <header-name>, <header-name>, ... 指令 <head

  • 问题内容: 我正在本地虚拟主机(http://foo.app:8000)上运行有角度的应用程序。它使用发出了对另一个本地VirtualHost(http://bar.app:8000)的请求。 当然,在Chrome开发者工具的网络标签中,我看到了OPTIONS请求,响应中包含标题: 但是,POST请求被取消,并出现以下错误: 所请求的资源上没有“ Access-Control-Allow-Orig

  • 我正在本地虚拟主机(http://foo.app:8000)上运行一个angular应用程序。它正在使用向另一个本地虚拟主机(http://bar.app:8000)发出请求。 在Chrome Developer Tools的Network选项卡中,我当然会看到选项请求,响应包括标题: 也设置为。

  • 问题内容: 将web.xml移植到Java配置后出现以下问题 根据一些Spring参考,尝试了以下尝试: 所选择的值来自有效的web.xml过滤器: 有什么想法为什么Spring java config方法不能像web.xml文件那样工作? 问题答案: 将CorsMapping从更改方法。 为整个应用程序启用CORS很简单: 你可以轻松更改任何属性,以及仅将此CORS配置应用于特定的路径模式: 控