【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方法,但是我们可以给我们自己的服务器修改请求头然后将获取到的数据响应返回到我们浏览器中。


相关文章
|
11天前
|
JSON JavaScript 前端开发
js跨域实现
【10月更文挑战第31天】在实际开发中,需要根据具体的需求和项目情况选择合适的跨域解决方案。
14 1
|
11天前
|
Web App开发 JavaScript 前端开发
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
|
24天前
|
缓存 监控 前端开发
JavaScript 实现大文件上传的方法
【10月更文挑战第17天】通过以上步骤和方法,我们可以实现较为可靠和高效的大文件上传功能。当然,具体的实现方式还需要根据实际的应用场景和服务器要求进行调整和优化。
|
11天前
|
JavaScript 前端开发 索引
js中DOM的基础方法
【10月更文挑战第31天】这些DOM基础方法是操作网页文档结构和实现交互效果的重要工具,通过它们可以动态地改变页面的内容、样式和行为,为用户提供丰富的交互体验。
|
11天前
|
缓存 JavaScript UED
js中BOM中的方法
【10月更文挑战第31天】
|
10天前
|
JavaScript 前端开发
.js方法参数argument
【10月更文挑战第26天】`arguments` 对象为JavaScript函数提供了一种灵活处理参数的方式,能够满足各种不同的参数传递和处理需求,在实际开发中具有广泛的应用价值。
27 7
|
11天前
|
JavaScript 前端开发 图形学
JavaScript 中 Math 对象常用方法
【10月更文挑战第29天】JavaScript中的Math对象提供了丰富多样的数学方法,涵盖了基本数学运算、幂运算、开方、随机数生成、极值获取以及三角函数等多个方面,为各种数学相关的计算和处理提供了强大的支持,是JavaScript编程中不可或缺的一部分。
|
17天前
|
JavaScript 前端开发 Go
异步加载 JS 的方法
【10月更文挑战第24天】异步加载 JavaScript 是提高网页性能和用户体验的重要手段。通过使用不同的方法和技术,可以实现灵活、高效的异步加载 JavaScript。在实际应用中,需要根据具体情况选择合适的方法,并注意处理可能出现的问题,以确保网页能够正常加载和执行。
|
22天前
|
JavaScript 前端开发 安全
在 Vue 项目中配置 CORS 的方法
【10月更文挑战第20天】在 Vue 项目中配置 CORS 需要综合考虑后端服务器配置、代理服务器使用以及前端的有限配置等多种因素。通过合理的配置和处理,可以有效地解决跨域问题,为项目的顺利进行提供保障。
|
28天前
|
人工智能 JavaScript 网络安全
ToB项目身份认证AD集成(三完):利用ldap.js实现与windows AD对接实现用户搜索、认证、密码修改等功能 - 以及针对中文转义问题的补丁方法
本文详细介绍了如何使用 `ldapjs` 库在 Node.js 中实现与 Windows AD 的交互,包括用户搜索、身份验证、密码修改和重置等功能。通过创建 `LdapService` 类,提供了与 AD 服务器通信的完整解决方案,同时解决了中文字段在 LDAP 操作中被转义的问题。