RESTful API 遇到跨域问题怎么办

阅读时长 4 分钟读完

1. 什么是跨域问题

在 Web 开发中,浏览器的同源策略是一项非常重要的安全特性。同源策略限制了来自不同源(协议、域名、端口)之间的数据传输,如 Ajax 请求、Cookie 或 DOM 的读写等。这是由于这些数据可能会被恶意网站利用,从而引起安全问题。

而当我们在开发 RESTful API 时,如果 API 提供的服务不是本域下的资源,也就是当我们的前端应用从一个域名请求一个另一个域名的接口时,浏览器就会启用「跨域安全策略」,防止页面通过脚本进行恶意操作。

2. 跨域问题的解决方案

虽然浏览器具有跨域安全策略,但是在开发过程中我们不可避免地需要进行跨域操作。为了解决这个问题,我们有多种方式:

2.1 CORS

CORS(Cross-Origin Resource Sharing)跨源资源共享是一种跨域解决方案,它的出现是为了让 Javascript 能够安全地获取到 AJAX 请求所需的数据。CORS 就是 W3C 标准,属于跨域 HTTP 访问的一种方式,通过在响应头部设置「Access-Control-Allow-Origin」来实现。

例如:

这个值也可以指定是哪些域名可以访问这个资源,如:

这种方式虽然简单好用,但也会引起安全隐患,所以对服务端数据的安全性有要求的话,可以考虑使用其他解决方案。

2.2 JSONP

JSONP 是一个非官方的解决方案,只支持 GET 请求。这种方式利用 script 标签不受同源策略的限制,通过动态创建 script 标签来进行跨域操作。

例如:

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

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

其中,callback 参数就是服务端返回数据时要调用的函数名。

2.3 代理

代理是一种将客户端请求转发到服务端的技术,其关键在于将跨域的请求转成同域的请求。例如,我们的前端应用都是在本地运行的,而后端服务在远程服务器上运行,假设我们需要访问的接口 URL 是:

我们可以在本地启动一个代理服务器,将请求转发到后端服务:

而代理服务器可以使用任意语言和框架实现,这里提供一个使用 node.js 的示例:

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

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

3. 总结

跨域问题是前端开发中非常常见的问题,本文中介绍了三种解决方案:CORS、JSONP 和代理。以上三种方案各有优劣,具体应根据实际需求进行选择。

在实际开发中,需要注意一些跨域的细节问题,例如「预检请求」和「携带 Cookie」等。总之,在跨域问题的解决方案上,多想一些,再选一些,才是更为合理的处理方式。

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

纠错
反馈