解决 Node.js 应用程序跨域问题的方法

阅读时长 4 分钟读完

什么是跨域问题?

当一个浏览器创建的网页通过 AJAX、WebSockets 或其他 API 向不同域名(例如 http://example.comhttps://api.example.com)的服务器发送请求时,就发生了跨域请求。由于安全原因,浏览器限制了跨域请求的使用,因为恶意站点可能会利用这种方式盗取用户数据或执行 CSRF 攻击。

跨域问题解决方案

CORS

一种常见的跨域解决方案是使用 CORS(跨源资源共享)。CORS 允许网站或应用程序向另一个源发出跨域 HTTP 请求。在 Node.js 中,我们可以使用 Express 框架的 cors 中间件来启用 CORS。

以下是一个简单的示例:

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

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

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

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

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

以上代码中,我们使用 Express 和 cors 包来创建一个简单的服务器并启用 CORS。

JSONP

JSONP 是一种用于解决跨域问题的老式技术。JSONP 利用了 HTML 中 <script> 标签不受同源策略限制的特性,在客户端动态创建<script>标签,并在请求URL中传递一个回调函数名称,服务端返回一段 JavaScript 代码执行该回调函数。

以下是一个简单的示例:

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

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

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

Proxy

另一种解决跨域问题的方法是使用代理。在这种情况下,我们可以在客户端发出请求时,将其发送到服务器上的本地 URL(即 localhost),然后在服务器端代表客户端发出真正的请求并返回响应。proxy-middleware 是一个用于 Node.js 的流行代理库。

以下是一个简单的示例:

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

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

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

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

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

在以上代码中,我们使用了 http-proxy-middleware 包来代理客户端发出的请求并将其发送到 https://example.com 上,并启用了 changeOrigin 选项以确保正确设置即将到达后端的请求头中的 host 字段。

结论

以上是三种常见的解决跨域问题的方法。使用 CORS 是最常见和推荐的方法,但如果您需要与老系统集成时,可以考虑使用 JSONP 和代理。希望本文对解决 Node.js 应用程序跨域问题有所指导,让您编写更安全,可靠的应用程序。

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

纠错
反馈