浏览器的跨域问题

2023-11-07

什么导致的浏览器的跨域问题?

不同源的ajax请求会导致出现跨域的错误。--必须要是ajax请求,并且是不同源的才会出现跨域问题。跨域主要是出现在浏览器阻止了响应的接收(服务器有接收到请求也有发出响应),这里是浏览器存在同源策略

什么是同源?

同源是指请求和响应的地址中协议相同、域名相同、端口相同,只要一个不相同就是不同源。

制造一个跨域错误

文件目录结构

跨域
├── public
│   ├── js
│   │   └── axios.js
│   └── api.html 
└── app.js

前端代码

<!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>
    <p>
        <button id="btn1_get">接口测试1:get请求带参数</button>
    </p>
    <p>
        <button id="btn2_post"> 接口测试2:post-传递普通键值对</button>
    </p>
    <p>
        <button id="btn3_postJSON">接口测试3:post-传递json</button>
    </p>
    <form id="myform">
        <input type="text" name="title">
        <input type="file" name="cover">
    </form>
    <button id="btn4_formdata">接口测试4:post-传递formdata</button>
    <hr />
    <script src="./js/axios.js"></script>
    <script>
        document.getElementById('btn1_get').addEventListener('click', () => {
            axios.get('http://localhost:3000/getapi', { params: { a: 1, b: 2 } })
        })
        var obj = {
            "name": "abc",
            "address": {
                "a": 1,
                "b": 2,
                "info": "c"
            }
        }
        document.getElementById('btn2_post').addEventListener('click', () => {
            const params = new URLSearchParams();
            params.append('param1', 'value1');
            params.append('param2', 'value2');
            axios.post('http://localhost:3000/post', params, {
                headers: { "content-type": "application/x-www-form-urlencoded" }
            })
        })

        document.getElementById('btn3_postJSON').addEventListener('click', () => {
            axios.post('http://localhost:3000/postJSON', obj)
        })

        document.getElementById('btn4_formdata').addEventListener('click', () => {
            var fd = new FormData(document.getElementById('myform'));
            axios.post('http://localhost:3000/publish',
                fd
            )
        })
    </script>
</body>
</html>

后端代码

// 静态资源托管,直接访问public/api.html
const express = require('express')
const app = express()

// 引包
const multer = require('multer')
// 配置,上传的文件都保存在uploads文件夹下面
const upload = multer({ dest: 'uploads/' })

// 托管静态资源
app.use(express.static('public'))

// 中间件--post请求普通键值对
app.use(express.urlencoded())

// 中间件--post请求参数json格式
app.use(express.json())

// 接口1--get
app.get('/getapi', (req, res) => {
  console.log('请求到的参数', req.query)
  res.send({ message: 'ok' })
})

// 接口2--post普通键值对
app.post('/post', (req, res) => {
  console.log('请求到的参数', req.body)
  res.send({ message: 'ok' })
})

// 接口3--post请求--json格式
app.post('/postJSON', (req, res) => {
  console.log('请求到的参数', req.body)
  res.send({ message: 'ok' })
})

// 接口4--文件的上传和下载
app.post('/publish', upload.single('cover'), (req, res) => {
  console.log('请求到的参数', req.body)
  console.log('请求到的文件参数', req.file)
  res.send({ message: 'ok' })
})

app.listen(3000, () => {
  console.log('3000');
})

实现页面--通过localhost正确访问

跨域错误展示--这里是因为和请求的域名不同导致的跨域问题

这里的错误是指缺少了响应头,认为不安全就报错了

解决的方法

  1. 请求和响应双方不同源--借助服务器代理
  2. 不是ajax请求--jsonp
  3. 让浏览器绕过同源策略--cors

1、请求和响应双方不同源--借助服务器代理(还在了解当中,后续更新)

2、JSONP解决

jsonp是一种借助于script的src属性来实现跨域请求的,它的本质是,jsonp根本不是ajax请求来访问接口的,所以它并不存在跨域的问题。

jsonp的原理

jsonp是通过script标签中的src属性来请求服务器端的接口。

服务器端会返回一个携带数据的JavaScript脚本,到script标签的内部。

后端代码

//后端发送一个get请求
app.get('/getJSONP', (req, res) => {
  //后端传输的数据必须要是字符串类型
  const data = JSON.stringify({ arr: [1, 2, 3], name: '张三', age: 18 })
  const str = `fn(${data})`
  res.send(str)
})

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    function fn(obj) {
      console.log('接收到的数据', obj)
    }
  </script>
  //src中存放着接口地址
  <script src="http://localhost:3000/getJSONP">
  // 后端发送的数据会放在此处
  </script>
</head>
<body>
  <h1>JSONP</h1>
</body>
</html>

然后从页面就可以看到请求成功,并没有出现跨域的问题

3、让浏览器绕过同源策略--cors

这里需要去下载一个cors包,然后引入cors包,这样我们就可以解决跨域的问题了

// 引入包--cors
const cors = require('cors')
// 中间件
app.use(cors())

也可以在请求中加上这么一句来解决跨域

相当于服务端响应的时候添加一个 Access-Control-Allow-Origin 的响应头

// * 表示允许任何域名来访问
  res.setHeader('Access-Control-Allow-Origin', '*')

使用cors来解决跨域问题就相当于给返回的响应加了一个响应头

JSONP和cors两种方法的区别

jsonp:

        不是ajax;

        只能支持get请求;

        兼容性比较好。

cors:

        前端不用做修改,只需后端操作;

        是ajax;

        支持各种请求方式;

        浏览器的支持不好(标准的浏览器都支持)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浏览器的跨域问题 的相关文章

  • 启用/禁用由用户输入确定的复选框

    我有一个简单的表单 用户可以在其中输入他的联系号码 如果联系号码以 07 开头 则该复选框已启用 其他我需要禁用它的复选框 我已经编写了一些代码 但我面临的问题是 当用户键入 01 时 它会被禁用 但如果他们继续在 01 之后添加任何其他数
  • 使用文件 API 将资源加载到 Three.js 中

    我想创建导入 3D 模型以在浏览器中查看的功能 方法是使用File API http www html5rocks com en tutorials file dndfiles Three js 加载器在我托管的文件上运行良好 我的理解是加
  • 通过JS Laravel访问存储目录

    有没有办法访问storage目录 该目录已经链接到publicJS 中的目录 我正在尝试制作一个上传图片的表单 验证脚本 if request gt hasFile photos marker gt photos request gt ph
  • Nodejs - 检查隐藏文件

    我正在迭代文件目录 想知道是否可以测试文件是否隐藏 目前 我只是检查文件是否以 开头或不 这适用于 Mac 也许还有 Linux 但是 我想知道如何在 Windows 上做到这一点 另外 句点会在所有版本的 Linux 中隐藏该文件吗 Th
  • 判断一个数字是否能被 3 或 5 整除 (FizzBu​​zz)

    如何根据输出是否能被 3 或 5 整除来更改输出 如果它能被 3 整除 我想显示 rock 如果它能被 5 整除 我想显示 star 类似于 FizzBu zz 如果两者都有 他们都会看到 这是我的代码 if var n Math floo
  • 循环遍历元素并逐步为每个元素应用 CSS 规则

    我有一个网格布局 每个网格布局中都有不同数量的元素 我想动态添加内联grid column通过循环遍历 div 中存在的每个元素的 CSS 规则 ul 与一类 list 所以 HTML 代码的输出需要是 ul class list ul u
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • Google 地图 API:忽略 DirectionService 请求中的季节性限制

    我目前正在开发一张地图 其中显示两点之间的最短路线 使用不同的交通工具 我注意到 有时 例如在冬季关闭的道路不会被考虑在内 我发现我可以使用方向服务 下面的代码 忽略高速公路 收费站和渡轮 但我一生都无法弄清楚如何 是否可以忽略季节性限制
  • 如何使用 vanilla JS 实现可维护的反应式 UI

    今天我遇到了一个问题 可以通过使用像 Vue 这样的反应式和状态管理框架来轻松解决 遗憾的是 无法使用它 以下 简化 情况 链接到代码笔 https codepen io theiaz pen BazErKV 我们有一个服务器渲染的页面 其
  • 如何处理requireJs超时错误?

    我正在使用 require js 作为加载框架编写一个移动混合应用程序 我遇到加载错误的问题 我想做的是在设备离线且无法下载在屏幕上显示地图所需的 google 地图 API 脚本时设置后备解决方案 我得到的只是 Uncaught Erro
  • Ember Data 中出现“超出最大调用堆栈大小”错误的原因可能是什么?

    Ember 发布新版本 3 6 0 后 我开始在控制台中收到错误 rsvp js 24 未捕获 RangeError 超出最大调用堆栈大小 在 WeakMap get 在 getCacheFor metal js 25 在 Computed
  • JavaScript 数组扩展语法的时间复杂度是多少?

    我想知道在 JavaScript 中使用数组扩展的时间复杂度是多少 是线性 O n 还是常数 O 1 下面的语法示例 let lar Math max nums 传播称为 Symbol iterator 有关对象的属性 对于数组 这将迭代数
  • 使用 AngularJS 多部分表单数据将文件上传到 Google Cloud Storage

    我正在尝试使用 AngularJS 中指定的多部分方法将图像文件上传到 Google Cloud Storagehttps cloud google com storage docs json api v1 how tos upload m
  • IE 中的每个 JavaScript 支持?

    我有这个代码
  • Phantom-node模块无法加载外部资源

    我正在开发一个nodejs服务器 它将发布的html呈现为pdf png或jpg https github com svenhornberg pagetox https github com svenhornberg pagetox ser
  • 在 HTML5 iOS 7 / iOS 8 中显示十进制键盘

    经过几个小时的搜索后 我只是有一个简单的问题 是否有可能在网络浏览器输入字段中显示小数键盘 input type number 只显示数字 但我需要在左下角使用逗号或点 我尝试过任何事情 pattern step等等 但没有显示十进制键盘
  • Node npm 包抛出使用严格:全局发布和安装后未找到命令

    我正在尝试发布 npm 包 当我全局安装该包并尝试运行 cli 命令时 我收到此错误 nvm versions node v0 12 2 bin myPack line 1 use strict command not found nvm
  • 如何使用 jQuery 或 JavaScript 聚焦 或 标签?

    for var i 0 i
  • 将 RequireJS 与遗留代码结合使用

    我正在处理一个非常大的项目 该项目使用 包含带有脚本标记的 javascript 文件的旧版 JSP 页面 使用其他 javascript 模块而不使用 RequireJS 的骨干模型和视图 现在 我们希望开始将 RequireJS 与 j
  • 从输入类型编号获取无效值

    我正在使用输入类型数字 当它无效时 我如何从中获取值 例如 使用类型编号并仅打印 e 这本身是无效的 我正在使用 React 但我认为这个问题非常普遍 onChange event console log event target valu

随机推荐

  • 服务器 分布式 虚拟化,「云计算」云计算的两大特性:虚拟化、分布式

    云计算技术出现以后 它会加速电信和互联网业务的融合 这个融合除了技术和运营方式的融合 或者创新模式的转变 主要是电信业务网络的全IP化和宽带化的发展 相互之间的渗透趋势越来越明显 借鉴互联网云计算发展思路 可以将电信网络现在的很多资源 包括
  • 系统提示缺少xinput1_3.dll怎么办?

    我们在使用电脑的过程中 总会遇到一些dll文件丢失的情况 大概是因为系统的内部组件受损或者是出现了某种冲突引起的 比如系统提示xinput1 3 dll丢失要如何解决呢 缺少xinput1 3 dll丢失怎么修复 1 出现如下的窗口提示 不
  • 【数据结构-队列】阻塞队列

    欢迎来到我的博客 很高兴能够在这里和您见面 希望您在这里可以感受到一份轻松愉快的氛围 不仅可以获得有趣的内容和知识 也可以畅所欲言 分享您的想法和见解 推荐 kuan 的首页 持续学习 不断总结 共同进步 活到老学到老 导航 檀越剑指大厂系
  • c++中 string 和 int 类型转换

    一 int 类型转换为 string 类型 示例 include
  • 逻辑综合——优化电路

    对进行时序路径 工作环境 设计规则等进行约束完成之后 DC就可以进行综合 优化时序了 DC在优化过程中主要的策略将在下面进行说明 然而 当普通模式下不能进行优化的 就需要我们进行编写脚本来改进DC的优化来达到时序要求 DC进行优化的目的是权
  • CTFSHOW萌新计划 web16-17

    题目地址 https ctf show 0x01 web16 这个直接爆破就可以了 但是如果你是官网群里的成员 就会知道有个36d的梗 payload 36d 爆破的话给个脚本 import hashlib str1 abcdefghijk
  • emulator: ERROR: x86 emulation currently requires hardware acceleration! Please ensure Intel HAXM is

    原文错误提示 emulator ERROR x86 emulation currently requires hardware acceleration Please ensure Intel HAXM is properly instal
  • ege库基于前中后序动态建立二叉树、序列检错以及查找公共父节点C++

    一 需求分析 1 任意输入前序 中序序列或者中序 后序序列 生成二叉树 3 利用打印二叉树功能显示二叉树的逐步构造过程 使用自上而下的二叉树显示 4 使用EGE xege org SFML www sfml dev org download
  • 写给程序员的机器学习入门 (九) - 对象识别 RCNN 与 Fast-RCNN

    因为这几个月饭店生意恢复 加上研究 Faster RCNN 用掉了很多时间 就没有更新博客了 这篇开始会介绍对象识别的模型与实现方法 首先会介绍最简单的 RCNN 与 Fast RCNN 模型 下一篇会介绍 Faster RCNN 模型 再
  • 如何利用双休日,每月稳定增加额外1500元收入?

    针对8种不同标签的人群 良心推荐12个稳定增加收入的副业 最短一天就能有收入 月入几千的大有人在 认真看有干货 很可能会成为你的主业 最好先点赞收藏 以免后面找不到 不管你是上班族还是学生党 一个副业除了可以帮助你赚钱 更重要的是给了你平淡
  • 国家开源软件资源库

    http yp oss org cn software show cat php cat id 5 基本信息 成熟度 Dimdim 2009 05 19 1 2 3 4 5 6 7
  • C++模板详解

    目录 1 什么是c 的模板 2 模板的概念 3 函数模板 1 什么是函数模板 2 函数模板的定义格式 3 案例 4 函数模板的实例化 1 隐式实例化 2 显式实例化 5 函数模板的重载 6 函数模板与普通函数小结 7 使用函数模板要注意的问
  • 将生成的pandas DataFrame数据写入excel的指定位置

    在文件中生成了DataFrame格式数据想要写入excel的指定位置 比如第三行的第二列 网上的方法基本是使用to excel直接写入 这样写入的位置就是固定的 不能指定位置 通过openpyxl灵活设置的方式写入数据 这种方式对传统的中国
  • LoadLibrary错误182

    转载请标明是引用于 http blog csdn net chenyujing1234 欢迎大家拍砖 一 问题描述 在win7下用一个MFC程序把从XP拷过来的msgina dll加载起来 调用LoadLibrary后返回错误码为 二 解决
  • 二进制安全虚拟机Protostar靶场(2)基础知识讲解,栈溢出覆盖变量 Stack One,Stack Two

    前言 Protostar靶场的安装和一些二进制安全的基础介绍在前文已经介绍过了 这里是文章链接 https blog csdn net qq 45894840 article details 129490504 spm 1001 2014
  • 【python练习题 02】按身高和体重排队

    题目 某学校举行运动会 学生们按编号 1 2 3 n 进行标识 现需要按照身高由低到高排列 对身高相同的人 按体重由轻到重排列 对于身高体重都相同的人 维持原有的编号顺序关系 请输出排列后的学生编号 输入 两个序列 每个序列由n个正整数组成
  • Q-learning

    学习增强学习有段时间了 也接触了 learning了 但对此理解不是很透彻 知道看到头条文章对一篇 翻译文才对此有了较深的理解 特此copy 望见谅 目录 故事案例 table简介 Q learning 算法 学习动作值函数 action
  • MATLAB中生成随机数方法总结

    好久没用MATLAB了 今天在利用MATLAB进行数据处理时 突然发现自己忘记了该如何产生自己需要的随机数形式 于是又查了一通资料 现对其进行一个简单的总结 供自己和大家以后参考 1 randi 产生均匀分布的伪随机整数 产生一个1至10之
  • linux下查询缺少的依赖文件归属于哪个rpm包

    我们在redhat下使用rpm ivh安装rpm包的时候 经常会报缺少依赖条件的错误 如下 root abc Packages rpm ivh httpd 2 4 6 17 el7 x8664 rpm 错误 依赖检测失败 etc mime
  • 浏览器的跨域问题

    什么导致的浏览器的跨域问题 不同源的ajax请求会导致出现跨域的错误 必须要是ajax请求 并且是不同源的才会出现跨域问题 跨域主要是出现在浏览器阻止了响应的接收 服务器有接收到请求也有发出响应 这里是浏览器存在同源策略 什么是同源 同源是