当前位置: 首页 > news >正文

express演示前端解决跨域的方法jsonp、cors

1.jsonp

jsonp全称

JSON with Padding

即json外面包了一层js函数外衣,jsonp主要是利用了html中<script>等带有src属性的标签进行服务器请求时可以不受跨域影响

①直接fetch请求
客户端代码

<!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>
    <style>

    </style>
</head>

<body>
    <script>
        fetch('http://localhost:3002/get')
        .then(res => res.json())
        .then(data => {
            console.log(data)
        })
    </script>
</body>

</html>

服务端代码

const express = require('express')
const app = express()
app.get('/get',(req, res) => {
	res.send('console.log("嘿嘿")')
})
app.listen(3002,() => {
    console.log("服务器启动")
})

以上代码毋庸置疑直接报跨域错误
在这里插入图片描述
②jsonp解决跨域思路

1.在<script>标签的src属性中发请求

<script src="http://localhost:3002/get"></script>

在这里插入图片描述
成功打印,说明客户端中src请求回来的资源会当作js代码执行,所以我们利用这个特性,希望获取的数据能通过外包裹一层函数的形式传递过来,因为函数属于js可执行的代码,而json数据不是。 代码如下

客户端代码

<!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>
    <style>

    </style>
</head>

<body>
    <script>
        cb = function(data) {
            console.log(data)
        }
    </script>
    <script src="http://localhost:3002/get?callback=cb"></script>
</body>

</html>

客户端预先定义了一个接受数据的函数,接着将该函数的函数名作为参数传递到服务端,后续服务端会将这个函数名和返回的数据拼接而返回

服务端代码

const express = require('express')
const app = express()
app.get('/get',(req, res) => {
    let data = {
        name:'小明',
        age:12
    }
    res.send(`${req.query.callback}(${JSON.stringify(data)})`)
})
app.listen(3002,() => {
    console.log("服务器启动")
})

浏览器打印:成功获取到服务器返回的数据
fa

2.cors

cors的核心即是响应头上加上
Access-Control-Allow-Origin: *
字段,即设置上允许跨域访问的域,* 即代表所有域都可以访问
客户端代码

    <script>
        fetch('http://localhost:3002/get')
        .then(res => res.json())
        .then(data => {
            console.log(data)
        })
    </script>

服务端代码

const express = require('express')
const cors = require('cors')
const app = express()
app.use(cors())
app.get('/get',(req, res) => {
    let data = {
        name:'小明',
        age:12
    }
    res.send(data)
})
app.listen(3002,() => {
    console.log("服务器启动")
})

结果:成功接受到数据:
在这里插入图片描述
请求头上带有Access-Control-Allow-Origin: *字段
在这里插入图片描述

相关文章:

  • SCA Sentinel 分布式系统的流量防控(二)
  • 姿态分析开源工具箱MMPose安装及使用示例(2d face landmark detection)
  • Java8中anyMatch()、allMatch()、noneMatch()用法详解
  • 【SpringMVC】SpringMVC实现转发和重定向
  • 离散化模板
  • 一种加权变异的粒子群算法-附代码
  • 带符号整数的除法与余数
  • Spring Cloud集成Dubbo实现RPC调用
  • 怎么开发自己的NFT平台
  • Android Context
  • 架构师的 36 项修炼第10讲:架构实战案例分析
  • 力扣每日一题-第63天-867. 转置矩阵
  • java基于ssm+vue的考研信息查询系统 elementui
  • 北大肖臻老师《区块链技术与应用》系列课程学习笔记[29]总结
  • C++设计模式之工厂模式(创建型模式)
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 11111111
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Angular2开发踩坑系列-生产环境编译
  • CentOS6 编译安装 redis-3.2.3
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaWeb(学习笔记二)
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • node-glob通配符
  • python 学习笔记 - Queue Pipes,进程间通讯
  • vue2.0项目引入element-ui
  • 测试如何在敏捷团队中工作?
  • 大主子表关联的性能优化方法
  • 浮动相关
  • 聊聊flink的BlobWriter
  • 小程序button引导用户授权
  • 学习HTTP相关知识笔记
  • 一个SAP顾问在美国的这些年
  • 应用生命周期终极 DevOps 工具包
  • 智能合约Solidity教程-事件和日志(一)
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​flutter 代码混淆
  • # Maven错误Error executing Maven
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $refs 、$nextTic、动态组件、name的使用
  • (二)fiber的基本认识
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (算法)前K大的和
  • (一)UDP基本编程步骤
  • (轉)JSON.stringify 语法实例讲解
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .form文件_SSM框架文件上传篇
  • .NET 发展历程
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • ::before和::after 常见的用法
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [20181219]script使用小技巧.txt