如何解决 RESTful API 中的 CORS 问题

阅读时长 4 分钟读完

什么是 CORS

在跨域访问时,浏览器通常会进行同源策略的检查来防止跨站请求伪造攻击。而 CORS(Cross-origin resource sharing)是一种机制,允许网页向跨源服务器发出 XMLHttpRequest 请求,从而克服了跨域访问的限制。

如何解决 CORS 问题

CORS 的标准流程

当浏览器发起跨域请求时,会发送一个 OPTIONS 请求向服务器请求访问其 API,服务器在响应头部加上 Access-Control-Allow-Origin 等字段,告知浏览器允许访问该 API 的域名,而这个域名则取决于请求头中 Origin 字段的值。

接下来,当浏览器再次发送真正的请求时,服务器可以在响应头部加上 Access-Control-Allow-Methods、Access-Control-Allow-Headers 等字段,告知浏览器接受哪些 HTTP 方法以及允许访问哪些 HttpHeaders。以此来控制跨域请求的访问权限。

JSONP 的使用

JSONP 是一种通过 script 标签进行跨域访问的方式,其原理是在服务端动态生成一些 JavaScript 代码,然后将这个代码作为响应内容返回给客户端,客户端再执行这个代码从而获得所需要的数据。

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

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

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

需要注意的是,JSONP 方式只能用于 GET 请求,并且服务端也需要支持 JSONP。

代理服务器的搭建

代理服务器是指位于客户端和服务器之间的一台位于本地的服务器。通过让客户端访问代理服务器,再由代理服务器去访问真正的服务器,从而实现跨域访问。常见的代理服务器有 nginx、Apache、http-proxy 等。

以 http-proxy 为例,首先需要安装该依赖:

然后在本地搭建一个代理服务器:

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

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

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

这里以本地 8000 端口为例,当客户端访问 localhost:8000/api/getData 时,该请求就会被代理服务器转发至 https://example.com/api/getData。

总结

以上是解决 CORS 问题的几种常见方式,虽然每种方式的具体实现略有不同,但都遵循了 CORS 标准流程,只不过是基于这个流程实现了不同的方案。根据自己的需求选择适合自己的方式,就可以解决跨域访问的问题了。

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

纠错
反馈