【node.js】跨域的解决办法(CORS方法、同源策列的理解)

简介: 面对cors跨域、同源策略的处理



下图为本文的核心

063a1355ef7b4f7cba3147b228398a50.png

一、 跨域介绍

浏览器使用 ajax时,如果请求了的接口地址和当前打开的页面地址不同源称之为跨域

二、同源策略

MDN官方文档传送门:浏览器的同源策略 - Web 安全 | MDN

是浏览器的一个重要的安全策略,它能帮助阻隔恶意文档,减少可能被攻击的媒介。

1.同源条件:

协议、主机、端口三者是一样的,后面跟的路径可以不相等

举几个例子:

比如我的url地址是  http://store.company.com/dir/page.html

http://store.company.com/dir2/other.html                 同源 只是路径不同

http://store.company.com/dir/inner/another.html      同源 只是路径不同

https://store.company.com/secure.html                   不同源 协议不同

http://store.company.com:81/dir/etc.html                 不同源 端口号不同(默认80)

三、跨域解决办法

在此介绍当前主流的CORS方法

CORS方法工作原理:服务器在返回响应报文的时候,在响应头中设置一个允许的header

也就是加上以下这段代码

res.setHeader('Access-Control-Allow-Origin', '*');

这行代码的工作过程:浏览器请求发送了, 服务器也响应了, 但是浏览器发现了跨域访问, 判断是否有`响应头: Access Control Allow Origin' (后端是否允许跨域访问, 如果允许, 浏览器就把数据留下, 否则抛弃掉然后报错)

来个例子感受下

1.创建一个js文件,设置好请求的地址

// 1.导入模块
const http = require('http')
const axios = require('axios')
const app = http.createServer(async (req, res) => {
  console.log(req.url)
  if (req.url === '/abc') {
    // 允许跨域响应头
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Content-Type', 'application/json;charset=utf-8');
    res.end(JSON.stringify({ name: '初映CY的前说', age: 22 }))
  } else if (req.url === '/list') {
    // (1)向其他任意接口发送请求
    const { data } = await axios.get('http://ajax-api.itheima.net/api/news')
    // (2)允许跨域响应头
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Content-Type', 'application/json;charset=utf-8');
    // (3)响应返回数据
    res.end(JSON.stringify(data))
  } else {
    res.end('404 not found')
  }
})
app.listen(3000, () => {
  console.log('开启成功');
})

2.创建一个html用来发送请求体验服务器接受不同的ajax请求做出不同的响应

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <button class="btn1">点我发送ajax1</button>
  <button class="btn2">点我发送ajax2</button>
  <script>
    document.querySelector('.btn1').addEventListener('click', function () {
      // 给我们自己nodejs服务器发请求
      const xhr = new XMLHttpRequest()
      xhr.open('get', 'http://127.0.0.1:3000/abc')
      xhr.send()
      xhr.onload = function () {
        console.log(xhr.responseText)//打印请求体中内容
      }
    })
    document.querySelector('.btn2').addEventListener('click', function () {
      //给别人服务器发请求
      const xhr = new XMLHttpRequest()
      //注意这是同源的知识路径不一样
      xhr.open('get', 'http://127.0.0.1:3000/list')
      xhr.send()
      xhr.onload = function () {
        console.log(xhr.responseText)
      }
    })
  </script>
</body>
</html>

3.素材好了,我们先开启我们的服务器

ce6e35cb953a4445af1e5e4587d29d18.png

4.当我req.url为abc时,服务器做出了响应

aa67d92e4a4b4cb1a525125bc56b5229.png

5.当我req.url为list时,服务器做出了响应

5b2dc05397de454096b22f18d09228a2.png

简单来说就是设置代理服务器,在我们自己的服务器中设置响应头与相关的req.url。

为什么需要代理呢?就是因为我们不可以给别人的服务器直接修改请求头用CORS方法,但是我们可以给我们自己的服务器修改请求头然后将获取到的数据响应返回到我们浏览器中。


相关文章
|
7月前
|
监控 负载均衡 JavaScript
有哪些有效的方法可以优化Node.js应用的性能?
有哪些有效的方法可以优化Node.js应用的性能?
357 69
|
2月前
|
安全 API PHP
PHP中实现CORS跨域资源共享的方法
通过这种方式,你可以在PHP应用中灵活地实现CORS,以支持跨域Web应用的需求。
182 15
|
7月前
|
人工智能 前端开发 JavaScript
webpack-dev-server代理后端一直报CORS跨域或500错误
在Vue项目中使用Webpack的devServer代理后端接口时,遇到500错误。问题根源在于浏览器请求中携带的Origin头导致服务器报错,而Postman测试正常。通过分析发现,调整或移除Origin头可解决问题。解决办法包括:1) 在代理配置中添加正确的Origin头;2) 删除请求中的Origin头。文章还深入解析了Origin头的作用及changeOrigin配置的实际意义,并附带相关文档链接,帮助开发者更好地理解与解决类似跨域问题。
467 20
|
6月前
|
JavaScript Linux 内存技术
Debian 11系统下Node.js版本更新方法详解
本指南详细介绍在Linux系统中安装和管理Node.js的步骤。首先检查现有环境,包括查看当前版本和清除旧版本;接着通过NodeSource仓库安装最新版Node.js并验证安装结果。推荐使用nvm(Node Version Manager)进行多版本管理,便于切换和设置默认版本。同时,提供常见问题解决方法,如权限错误处理和全局模块迁移方案,以及版本回滚操作,确保用户能够灵活应对不同需求。
502 0
|
6月前
|
JavaScript Linux 内存技术
Debian 11系统下Node.js版本更新方法
Debian 11更新Node.js主要就是这三种方式,无论你是初涉其中的新手还是找寻挑战的专家,总有一种方式能满足你的需求。现在,你已经是这个
586 80
|
3月前
|
JavaScript 前端开发
js小数运算出现的问题(精度丢失)及解决办法-亲测有效
JavaScript浮点数运算存在精度丢失问题,如0.1+0.2不等于0.3。原因是十进制小数转二进制时可能出现无限循环,导致舍入误差。本文提供一种精度处理方法,通过将小数转为整数运算后再还原,实现加减乘除的精确计算,解决常见浮点运算误差问题。
565 0
|
9月前
|
前端开发 JavaScript 应用服务中间件
前端跨域问题解决Access to XMLHttpRequest at xxx from has been blocked by CORS policy
跨域问题是前端开发中常见且棘手的问题,但通过理解CORS的工作原理并应用合适的解决方案,如服务器设置CORS头、使用JSONP、代理服务器、Nginx配置和浏览器插件,可以有效地解决这些问题。选择合适的方法可以确保应用的安全性和稳定性,并提升用户体验。
5738 90
|
9月前
|
JSON 缓存 前端开发
对CORS(跨域)的一些见解
CORS(跨域资源共享)是W3C标准,用于解决AJAX跨源请求限制。浏览器与服务器需共同支持CORS,浏览器自动处理请求头,开发者无需额外操作。CORS分为简单请求与非简单请求:简单请求满足特定条件(如方法为GET/POST/HEAD且头信息有限制),浏览器直接发送;非简单请求需先进行“预检”请求(OPTIONS方法),确认服务器允许后才发送实际请求。服务器回应需包含Access-Control-Allow-Origin等字段,以控制跨域访问权限。
216 10
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
724 62
|
存储 JavaScript 搜索推荐
Node框架的安装和配置方法
安装 Node 框架是进行 Node 开发的第一步,通过正确的安装和配置,可以为后续的开发工作提供良好的基础。在安装过程中,需要仔细阅读相关文档和提示,遇到问题及时解决,以确保安装顺利完成。
657 58