解决 PWA 中使用 fetch 时跨域请求被拦截的问题

背景

PWA(Progressive Web App)是一种新型的 Web 应用程序,它可以像本地应用程序一样运行,并且可以在离线时继续工作。PWA 中使用的 fetch API 可以轻松地从服务器获取数据,但是在跨域请求时会被浏览器拦截,导致请求失败。

问题分析

跨域请求被浏览器拦截是因为浏览器的同源策略(Same-Origin Policy)。同源策略要求浏览器只能访问与当前页面具有相同协议、主机和端口的资源。如果请求的资源不符合同源策略,浏览器就会拒绝请求。

解决方案

1. 服务器设置 CORS

CORS(Cross-Origin Resource Sharing)是一种跨域资源共享机制,它允许服务器向其他域名的网页发送 XMLHttpRequest 请求。服务器可以通过设置 HTTP 响应头来启用 CORS。

在服务器端添加以下 HTTP 响应头,即可启用 CORS:

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

其中 * 表示允许所有域名的请求。如果只想允许特定的域名请求,可以将 * 替换为该域名。

2. 使用代理服务器

由于浏览器的同源策略,我们无法直接访问其他域名的资源。但是,我们可以通过代理服务器来解决这个问题。代理服务器可以将浏览器发送的请求转发到目标服务器,并将响应返回给浏览器。

例如,我们可以在本地启动一个 Node.js 服务器,将浏览器发送的请求转发到目标服务器:

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

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

然后,在 PWA 中使用代理服务器的地址来发送请求:

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

3. JSONP

JSONP(JSON with Padding)是一种跨域解决方案,它利用了 <script> 标签可以跨域加载资源的特性。JSONP 请求是通过在 URL 中添加一个回调函数名的方式来实现的。

例如,我们可以在服务器端返回以下 JSONP 数据:

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

然后,在 PWA 中使用以下代码来发送 JSONP 请求:

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

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

总结

跨域请求被浏览器拦截是 Web 开发中常见的问题,但是通过 CORS、代理服务器和 JSONP 等解决方案,我们可以轻松地解决这个问题。在使用 PWA 开发时,我们需要选择合适的解决方案来处理跨域请求,以确保应用程序的正常运行。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6610bcb2d10417a22215f024