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


相关文章
|
1月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
1月前
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
130 52
|
1月前
|
缓存 JavaScript UED
js中BOM中的方法
【10月更文挑战第31天】
|
1月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
springboot解决js前端跨域问题,javascript跨域问题解决
|
23天前
|
安全 Java 应用服务中间件
SpringBoot:CORS是什么?SpringBoot如何解决跨域问题?
CORS是Web开发中常见且重要的机制,SpringBoot通过提供注解、全局配置和过滤器等多种方式来解决跨域问题。选择适合的方式可以帮助开发者轻松处理跨域请求,提高应用的灵活性和安全性。
52 2
|
1月前
|
缓存 JavaScript 前端开发
JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用
本文深入讲解了 JavaScript 与 DOM 交互的基础及进阶技巧,涵盖 DOM 获取、修改、创建、删除元素的方法,事件处理,性能优化及与其他前端技术的结合,助你构建动态交互的网页应用。
47 5
|
1月前
|
安全
CORS 跨域资源共享的实现原理是什么?
CORS 跨域资源共享的实现原理是什么?
|
1月前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
27 1
|
1月前
|
开发框架 中间件 Java
如何处理跨域资源共享(CORS)的 OPTIONS 请求?
处理 CORS 的 OPTIONS 请求的关键是正确设置响应头,以告知浏览器是否允许跨域请求以及允许的具体条件。根据所使用的服务器端技术和框架,可以选择相应的方法来实现对 OPTIONS 请求的处理,从而确保跨域资源共享的正常进行。
|
1月前
|
JavaScript 前端开发
.js方法参数argument
【10月更文挑战第26天】`arguments` 对象为JavaScript函数提供了一种灵活处理参数的方式,能够满足各种不同的参数传递和处理需求,在实际开发中具有广泛的应用价值。
45 7