前端 三种解决跨域问题 jsonp 、CORS、代理服务器 解决跨域全家桶

news2024/11/13 9:09:47

我的报错情况是 后端接口是3000 前端本地接口是8080,最后出现跨域
在这里插入图片描述
1.什么是跨域?
首先跨域是一种安全机制,是在开发上线前考虑到的安全问题并且需要采取合适的手段去避免这个问题带来的程序错误,接口跨域可以后端处理,也可以前端处理,一般情况下后端会处理跨域的问题,但是为了避免拿到的接口没有解决,我们也可以通过前端来处理跨域这个需求。

2.为什么出现跨域问题:
在这里插入图片描述
浏览器不能执行其他网站的脚本,是由浏览器同源策略限制的一类请求场景,从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。
同源策略是指"协议+ 域名+端口“三者相同,即便两个不同的域名指向同一个ip地址,也非同源,违背同源策略就是跨域。
3.如果不解决跨域会出现什么问题?
首先接口请求不成功
同源策略它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。

4.通过几个案例查看是否跨域了
案例一:是没有跨域问题

浏览器地址: http://localhost:8080/query2.
Ajax请求地址: http://localhost:8080/select

案例二:(跨域了,端口号不一样)

1.浏览器地址: http://localhost:8080/query
2.Ajax请求地址: http://localhost:8081/select

案例三:(跨域了 协议不一样)

1.浏览器地址: http://localhost:8080/query
2.Ajax请求地址: https://localhost:8080/select

案例四:(跨域了 域名不一样)

1.浏览器地址: http://www.baidu.com/query
2.Ajax请求地址: http://163.177.151.109/select

案例五:(没有跨域:: 默认端口号可以省略 https443)

1.浏览器地址 : http://192.168.1.3:80/query
2.Ajax请求地址: http://192.168.1.3/select

案例6:(没有跨域:: 默认端口号可以省略: https443)

1.浏览器地址: https://192.168.1.3/query
2.Ajax请求地址: https://192.168.1.3:443/select

jsonp解决跨域
1.JSONP解决同源限制问题
原理:利用script标签的src属性可以跨域加载资源的特性,通过动态创建script标签来实现跨域请求。
跨源网络访问的三种方式:跨域写操作,跨域资源嵌入,跨域读操作
前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 静态请求 -->
    <!-- <script src="http://127.0.0.1:30/api/getData?cb=callback"></script> -->
    <script>
        // 动态创建script标签
        const script = document.createElement('script')
        // 设置src属性
        script.src = 'http://127.0.0.1:3000/api/getData?cb=callback'
        // 接收后端的回调函数
        function callback(res) {
            console.log(res,'res');
        }
        // 将script挂载到页面上
        document.getElementsByTagName('body')[0].appendChild(script)
    </script>
</body>
</html>

node.js页面 (改完之后需要重启一下)

// 引入express
const express = require('express')
// 创建实例
const app = express()
// 创建监听端口
const port = 3000
//  定义接口
// app.get('/api/getData',(req,res) =>{
//     // 返回的结果
//     res.send({
//         code:10000,
//         data:{
//             msg:'hellow '
//         }
//     })
// })
// 动态定义接口
app.get('/api/getData',(req,res) =>{
    // 获取前端参数
    const { cb } = req.query
    res.send(`${cb} (${JSON.stringify({
        code:10000,
        data:{
            msg:'哈哈'
        }
    })})`)
})
// 监听当前的端口
app.listen(port,() =>{
    console.log(`server start! port:${port}`);
})

测试
在这里插入图片描述
cores解决跨域问题
原理:需要服务器实现CORS接口,在服务器端设置响应头,允许指定的域名访问资源。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>跨域问题</title>
</head>
<body>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.5.0/axios.min.js"></script>
    <script>
        axios({
            methods:'get',
            url:'http://localhost:3000/api/getData'
        })
    </script>
</body>
</html>
// 引入express
const express = require('express')
// 创建实例
const app = express()
// 创建监听端口
const port = 3000
// '*'  匹配所有任意的路径   req:请求体,res:响应体,next:下一步
app.all('*',(req,res,next)=>{
    res.header('Access-Control-Allow-Origin', '*') //允许所有的请求源
    res.header('Access-Control-Allow-Headers', '*') //允许所有的请求源 X-Token
    res.header('Access-Control-Allow-Methods', '*') //允许所有的请求源 get post put delete
    next()
})
//  定义接口
app.get('/api/getData',(req,res) =>{
    // 返回的结果
    res.send({
        code:10000,
        data:{
            msg:'hellow '
        }
    })
})
// JSONP动态定义接口
// app.get('/api/getData',(req,res) =>{
//     // 获取前端参数
//     const { cb } = req.query
//     res.send(`${cb} (${JSON.stringify({
//         code:10000,
//         data:{
//             msg:'哈哈'
//         }
//     })})`)
// })
// 监听当前的端口
app.listen(port,() =>{
    console.log(`server start! port:${port}`);
})

在这里插入图片描述

代理服务器
原理:在同源策略下,通过在同一域名下设置代理服务器,将跨域请求转发到目标服务器上。
在这里插入图片描述
配置代理服务器(仅限于解决本地跨域;项目上线或者打包,要不通过后端解决,要不前端通过nginx反向代理)
在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1304908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker的安装与简单操作命令

目录 前言 docker的安装 基础docker操作 容器管理 镜像管理 容器镜像封装与加载 前言 前文简单说明了容器技术出现的背景&#xff0c;与对docker做了结构上的介绍Container容器技术简介-CSDN博客https://blog.csdn.net/qq_72569959/article/details/134814887 讲到dock…

Day07 Liunx高级系统设计8-线程

概述 进程与线程 进程 : 系统分配资源的基本单位 , 可以简单理解为一个正在进行的程序 线程 : 操作系统调度的最小单位 , 就是一段代码的执行顺序 注意&#xff1a; 1, 一个进程必须要有一个线程 , 该线程被称为主线程 2, 一个进程可以有多个线程 , 除主线程外的其他线程都是…

玻色量子袁为出席中国移动第四届科技周量子计算算法与应用分论坛

9月12日&#xff0c;中国移动第四届科技周“量子计算算法与应用”分论坛在北京成功举办&#xff0c;中国移动研究院院长黄宇红发表致辞&#xff0c;中国移动未来研究院院长崔春风全程主持。玻色量子作为光量子计算领域真机测试与场景应用的标杆企业应邀出席&#xff0c;玻色量子…

散点图,何须图,折线图混放在一个echarts

散点图&#xff0c;何须图&#xff0c;折线图混放在一个echarts option {tooltip: {trigger: axis,axisPointer: {type: cross,crossStyle: {color: #999}}},legend: {data:[盒须图1,盒须图2,折线图,散点图]},xAxis: [{type: category,data: [周一,周二,周三,周四,周五,周六…

智能优化算法应用:基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于花授粉算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.花授粉算法4.实验参数设定5.算法结果6.参考文…

vue3 + ts 防抖指令,节流指令,复制指令

vue3 ts 自定义指令 防抖指令&#xff0c;节流指令&#xff0c;复制指令 本文使用了 element-ui , element-plus 官网 源文件 https://admin.spicyboy.cn/#/directives/debounceDirect 新建 copy.ts 文件 &#xff08;复制指令&#xff09; import type { Directive, Di…

重新思考U-Net在医学超声图像分割中的应用(NU-net)

Rethinking the Unpretentious U-net for Medical Ultrasound Image Segmentation 摘要&#xff1a; 乳腺肿瘤分割是帮助我们描述和定位肿瘤区域的关键步骤之一。然而&#xff0c;乳腺肿瘤形态多变、边界模糊、强度分布相似&#xff0c;给乳腺肿瘤的准确分割带来了挑战。近年…

java系列-LinkedHashMap

1.插入新节点时&#xff0c;会将该节点加到链表尾部 public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{/*** The head (eldest) of the doubly linked list.*/transient LinkedHashMapEntry<K,V> head;/*** The tail (young…

C语言数据结构-栈和队列

文章目录 1 栈的表示与实践1.1 栈的概念及结构1.2 定义数据结构1.3 初始化与销毁1.4 入栈1.5 出栈1.6 栈顶的数据1.7 栈的个数1.8 栈是否是空1.9 打印栈 2 队列的表示与实现2.1 队列的概念与结构2.2 队列的数据结构定义2.3 队列的初始化与销毁2.4 入队2.5 出队2.6 取队头数据2.…

enumerate()函数讲解+同时获取索引和对应的元素值+实例

enumerate()函数是Python内置函数&#xff0c;用于在遍历可迭代对象&#xff08;如列表、字符串、元组等&#xff09;时&#xff0c;同时获取索引和对应的元素值。 它的主要作用是在循环过程中方便地获取索引和元素。 下面以两个例子来进行介绍理解。 目录 一、例子1 二、例…

打造‘产业大数据综合服务平台’,助力智慧园区建设!

随着大数据、人工智能、云计算、物联网等新一代信息技术的发展与应用&#xff0c;我国各类型园区正在向“智慧园区”转型升级&#xff0c;逐步开启数字化、智能化的运营管理模式。智慧园区的建设不仅需要基础设施的智慧化&#xff0c;更要实现园区规划、运营、管理、服务的智慧…

plf::list原理分析

plf::list是一个比std::list性能要好的另外一种实现&#xff0c;根据作者的性能测试&#xff1a; 293% faster insertion 57% faster erasure 17% faster iteration 77% faster sorting 70% faster reversal 91% faster remove/remove_if 63% faster unique 811% faster clear …

Vue 3 + Tailwind CSS:打造现代化项目的完美组合

Vue 3 Tailwind CSS&#xff1a;打造现代化项目的完美组合 本篇教程将向你介绍如何将 Tailwind CSS 与 Vue 3 项目搭配使用&#xff0c;为你的项目提供现代化的 UI 呈现和开发体验。通过本文的逐步演示和示例代码&#xff0c;你将很快掌握在 Vue 3 中集成和使用 Tailwind CSS…

YOLOv7改进实验:一文了解YOLOv7如何打印FPS指标

💡该教程为改进YOLOv7指南,属于《芒果书》📚系列,包含大量的原创首发改进方式🚀 💡🚀🚀🚀本博客内含改进源代码,按步骤操作运行改进后的代码即可 💡更方便的统计更多实验数据,方便写作 新增YOLOv7打印FPS指标 完善(一键YOLOv7打印FPS指标) 文章目录 完善…

【Tomcat】java.net.BindException “Address already in use: NET_Bind“

问题 17:37 Error running Tomcat 7.0.76: Unable to open debugger port (127.0.0.1:14255): java.net.BindException "Address already in use: NET_Bind"调整 把14255 改成 49963就正常了 附件 netstat -aon|findstr "49963" taskkill -f -pid xxx…

机械中常用的一些术语

目录 一、OEMSOP:SOP编写指南 WI(标准作业指导书):标准作业程序 &#xff08;SOP&#xff09;:SOP和WI的区别&#xff1a;一、PFC、FMEA、PCP、WIPPAP、PSW&#xff1a;APQP&#xff1a;BOM&#xff08;Bill of Material&#xff09;物料清单DV&#xff08;设计验证&#xff09…

C++STL的vector模拟实现

文章目录 前言成员变量成员函数构造函数push_backpop_backinserterase析构函数拷贝构造 前言 成员变量 namespace but {template<class T>class vector{public:typedef T* iterator;private:iterator _start;iterator _finish;iterator _end_of_storage;}; }我们之前实…

《opencv实用探索·十八》Camshift进行目标追踪流程

CamShift&#xff08;Continuously Adaptive Mean Shift&#xff09;是一种用于目标跟踪的方法&#xff0c;它是均值漂移&#xff08;Mean Shift&#xff09;的扩展&#xff0c;支持对目标的旋转跟踪&#xff0c;能够对目标的大小和形状进行自适应调整。 cv::CamShift和cv::me…

【CANopen进阶日记】③ CANopen对象字典工具

【CANopen进阶日记】专栏目录 第一章 CAN协议栈详解 第二章 CANopen协议栈详解 第三章 CANopen对象字典工具 文章目录 【CANopen进阶日记】专栏目录前言一、对象字典简介二、CANopen协议栈框架三、NMT主从四、SDO客户端服务器五、PDO生产者消费者5.1 RPDO5.2 TPDO同步周期5.3 …

python代码200行左右,python100行代码案例

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python代码200行左右&#xff0c;python100行代码案例&#xff0c;今天让我们一起来看看吧&#xff01; 有用的 Python 单行代码片段&#xff0c;只需一行代码即可解决特定编码问题&#xff01; 在本文中&#xff0c;我…