解决 XMLHttpRequest 无法正确发送跨域请求的问题

阅读时长 4 分钟读完

在前端开发中,经常需要通过 XMLHttpRequest 对其他域名下的资源进行请求。然而,由于浏览器的同源策略限制,这种跨域请求往往会被阻止。本文将介绍如何解决这个问题,并提供示例代码。

同源策略

同源策略是浏览器的一种安全策略,它限制了来自不同源的脚本在同一个文档中运行。同源指的是协议、域名、端口号均相同。比如,http://example.comhttp://www.example.com 就不是同源。

同源策略的目的是防止恶意脚本窃取用户的敏感信息。如果没有同源策略,那么一个恶意脚本就可以通过跨域请求获取其他网站的用户信息。

跨域请求的问题

由于同源策略的限制,XMLHttpRequest 无法直接发送跨域请求。如果尝试发送跨域请求,浏览器会报错,如下所示:

这个错误提示告诉我们,浏览器阻止了来自 http://localhost:3000 这个源的请求访问 http://example.com/api 这个资源。原因是 http://example.com 没有设置正确的 CORS 头部。

解决方案

要解决这个问题,我们需要让 http://example.com 设置正确的 CORS 头部,允许 http://localhost:3000 的请求访问。通常情况下,需要设置以下几个头部:

  • Access-Control-Allow-Origin:指定允许的源,可以是 *、单个源或多个源的列表。
  • Access-Control-Allow-Methods:指定允许的 HTTP 方法,比如 GET、POST、PUT 等。
  • Access-Control-Allow-Headers:指定允许的自定义头部。
  • Access-Control-Allow-Credentials:指定是否允许发送 Cookie。

示例代码如下:

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ----------

------------- ---- ----- -- -
  -------------------------------------------- -------------------------
  --------------------------------------------- ----- ----- ---- ---------
  --------------------------------------------- ----------------
  ------------------------------------------------- --------
  -------
---

--------------- ----- ---- -- -
  ---------- -------- ------- ------- ---
---

---------------- -- -- -
  ------------------- ------- -- ---- -------
---

这个示例代码使用了 Express 框架来创建一个 HTTP 服务器。在中间件中设置了 CORS 头部,允许 http://localhost:3000 发送跨域请求访问 /api 接口。在 /api 接口中返回了一个简单的 JSON 响应。

客户端代码如下:

-- -------------------- ---- -------
----- --- - --- -----------------

------------------- - -----

---------------------- - ---------- -
  -- --------------- --- - -- ---------- --- ---- -
    ------------------------------
  -
--

--------------- ------------------------- ------
-----------

这个客户端代码使用了 XMLHttpRequest 对 http://example.com/api 发送了一个 GET 请求。为了让浏览器发送 Cookie,需要设置 xhr.withCredentials 属性为 true。

总结

跨域请求是前端开发中常见的问题,解决它需要了解同源策略和 CORS 头部的相关知识。在实际开发中,我们可以使用 Express 框架来方便地设置 CORS 头部。同时,我们也可以使用第三方库来简化跨域请求的代码编写。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65e17d4d1886fbafa4e797b2

纠错
反馈