Deno 中如何处理 CORS 跨域问题

什么是 CORS ?

CORS(跨源资源共享,Cross-Origin Resource Sharing)是一个用于描述浏览器如何处理跨源请求的安全机制。在浏览器中,同源策略是一个重要的安全特性,它保证了一个网站只能读取自己网站的数据,而不能读取其他网站的数据。跨域请求则是指在一个网站的页面中使用了另外一个域名的资源,如 Ajax 发起的请求等。这种情况下,浏览器为了遵守同源策略,会限制跨域请求的权限,而 CORS 则是为了规避同源策略的限制而设计的机制。

Deno 中如何处理 CORS ?

Deno 是一个安全的 TypeScript 运行时环境,它有着类似于 Node.js 的 API 设计,而且在处理跨域请求方面非常灵活,下面让我们进入实战环节。

通过标记 --allow-net 处理 CORS

在 Deno 中向外部服务请求数据时,需要通过标记 --allow-net 来授予访问外部服务的权限。若请求的地址是跨域的,则 Deno 默认是不允许跨域的。那么,如何在 Deno 中处理跨域请求呢?以一个简单请求为例:

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

我们使用 fetch API 请求了一个 Vue.js 的 js 文件,并打印了其内容。但当我们运行该代码时,会发现在运行过程中出现类似以下的跨域报错信息:

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

这时候我们可以通过添加 --allow-net 标记来授权相应资源的访问权限,如下所示:

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

这样,在请求跨域资源时便可以避免跨域报错的问题了。

处理 CORS 预请求 OPTIONS

如果你需要使用 PUT、DELETE 或者其它开发者定义的 HTTP 方法,你会注意到会出现如下错误:

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

这是因为浏览器会自动在 POST,PUT,DELETE 类型的请求前发起一个 OPTIONS 请求,称为 CORS 预请求,以获知服务器是否允许该跨域请求。为了能够响应这个 preflight 请求,服务器需要添加 Access-Control-Allow-Origin 和 Access-Control-Allow-Headers 这两个响应头。在 Deno 中,可以通过如下代码为预请求添加响应头:

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

这样,预请求就可以被成功响应了。

总结

通过上述实例我们可以看出,在 Deno 中处理 CORS 跨域请求非常方便。在跨域场景下,我们可以通过带有 --allow-net 标记的 deno 命令来掌握请求数据权限,同时也可以通过响应预请求的方式规避跨域请求的安全限制。希望本文对您有所帮助,如有疑问或者建议,欢迎留言讨论!

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