【逐点突破系列】 深入跨域,web快速开发框架

function receiveMessage(event) {

console.log(‘event’, event)

}

window.addEventListener(“message”, receiveMessage, false);

postMessage

复制代码

我就直接说一下大概的思路了: 首先看看B页面:

  1. 在B页面有一个按钮,点击这个按钮会触发一个方法,post()

  2. 在post()方法中,window.postMessage(“hi there!”, location.origin),发送到所有同源的窗口,注意,当前窗口也会收到

  3. 之后通过 window.addEventListener(“message”, receiveMessage, false)去监听,如果有数据,就执行receiveMessage(),把数据打印出来

再来看A页面:

  1. 在A页面也有一个按钮,当点击这个按钮时触发test()

  2. 打开新窗口,并建立窗口的引用变量op = window.open(‘B.html’, ‘_blank’);

  3. op.addEventListener(“message”, receiveMessage, false); 监听新开窗口发来的消息,通过 receiveMessage() 把数据打印出来

3.2.2、如何正确的使用,以保证安全性?

  1. 始终使用origin和source属性验证发件人的身份,没有验证origin和source属性会导致跨站点脚本攻击。

  2. 当使用postMessage将数据发送到其他窗口时,指定精确的目标origin,而不是*

3.3、JSONP


JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。

3.3.1、JSONP的介绍

JSONP 是通过在<script></srcipt>标签里,通过src,img,href 属性的跨域方式向一个不同源的网站地址发送http请求,并且使得json数据可以在javascript代码中能够使用。

它规避了javascript代码中的跨源网络访问,也就是无法使用XMLHttpRequest,fetch被同源机制管到了(如果不同源的话)。

提前准备一个接口:https://photo.sina.cn/aj/index?page=1&cate=recommend 直接网页中打开,我们是可以看到有很多数据的,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VOqT1VMJ-1618820609526)(https://upload-images.jianshu.io/upload_images/23129380-7f4e1aed616cbfa6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

让我们尝试在本地请求一下这个地址,看看能不能拿到数据:因为双方地址并不是同源的,因此这样请求会报跨域的错:

复制代码

通过 live-server打开浏览器,在控制台可以看到报错了,因为这个是一个跨域的请求:

接下来我们来看看JSONP如何解决这个问题:

3.3.2、jsonp 如何使用?原理是什么?返回数据格式?前端怎么处理?

还是请求上面的这个网站地址,我们把代码改成下面这样:

复制代码

再来看看页面控制台输出:

data成功取到了。但是我们的数据到达之后是json数据,不能直接使用,script标签是一个加载资源的标签,它并不能直接运行这个代码。

事实上我们是在访问的时候,在请求的地址后面加上一个,&callback=callback,通知服务器,本地想进行一个跨资源访问(以JSOP的形式进行跨域)。等号后面的callback是一个你自己定义的函数,名字可自取,这个函数就是,通知我需要请求的地址,这边页面上我有一个函数,它会等待调用,用来执行你发过来的数据(也就是可以去执行把数据请求下来的操作)。

因此在数据到达之后,还包了一层函数 callback({data}),当数据通过script标签请求下来之后,再通过callback实现了一个调用本地资源的能力。

最后再理一下这部分的内容:

  • JSONP的原理

script标签请求数据,在请求的地址后面加上一个,&callback=callback,请求的服务器就在json数据外面包一层callback函数,当这个带有数据的callback函数可以在script得到之后可以运行的函数:

  • 返回的数据格式

JSON

  • 以及前端如何处理的

JSON with padding — callback({data})

3.3.3、自己封装一个jsonp?

  1. 准备工作

复制代码

  1. 具体实现流程
  • 确定传递参数: url 、携带的参数 、callback;

  • 处理url上的参数(?后面的);

  • 准备好url(携带callback函数);

  • 构建script标签;

  • 把这个标签挂到window上

复制代码

3.3.4、实现一个jsonp服务器端?(node版本,express版本)

node版本

创建一个结构如下的服务器端文件夹,我们将在index.js中实现我们的JSONP:

var http = require(‘http’);

http.createServer(function(req, res){

// req url callback=?

console.log(req.url);

let data = {a: 1};

res.writeHead(200, {‘Content-type’ : ‘text/json’})

const reg = /callback=([\w]+)/

if (reg.test(req.url)) {

let padding = RegExp.$1

res.end(${padding}(${JSON.stringify(data)}))

} else {

res.end(JSON.stringify(data));

}

// res.end(‘

Hello World

’);

res.end(JSON.stringify(data));

}).listen(3000);

复制代码

express 版本

var express = require(‘express’);

var cors = require(‘cors’);//后端cors 中间件

const app = express();

app.use(cors());

app.get(‘/product’,(req,res)=>{

res.json({

a:1,

b:2

})

})

app.listen(8000,()=>{

console.log(‘server is ok’)

})

复制代码

3.4 cors


3.4.1、介绍一下cors?

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

3.4.2、简单请求和非简单请求?

浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。

除了简单请求其他的都是非简单请求,因此只要记住哪些是简单请求就可以啦:

简单请求:(需要同时满足下面两种条件)
  1. 请求方法是以下三种方法之一:
  • HEAD

  • GET

  • POST

  1. HTTP的头信息不超出以下几种字段:
  • Accept:设置接受的内容类型(请求头)

  • Accept-Language:设置接受的语言(请求头)

  • Content-Language:为封闭内容设置自然语言或者目标用户语言(响应头)

  • Content-Type:(设置请求体的MIME类型(适用POST和PUT请求))只限于三个值

application/x-www-form-urlencoded

中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

multipart/form-data:将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。

text/plain:text/plain :纯文本格式

3.4.3、项目中怎么使用?

  • 服务器端:

const express = require(‘express’);

const app= express();

app.get(‘/’, (req, res)=>{

console.log(‘server is OK’);

res.end(‘jingjing’)

});

// app.use((req, res, next) => {

// res.header(“Access-Control-Allow-Origin”,‘http://localhost:5500’);

// res.header(“Access-Control-Allow-Credentials”, true);

// res.header(“Access-Control-Allow-Headers”, ‘Content-Type,Content-Length,Authorization, Accept,X-Requested-With’);

// res.header(“Access-Control-Allow-Methods”, ‘PUT,POST,GET,DELETE,OPTIONS,HEAD’);

// req.method === ‘OPTIONS’ ? res.send(‘CURRENT SERVICES SUPPORT CROSS DOMAIN REQUESTS!’) : next();

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

Vue

  • 什么是MVVM?

  • mvvm和mvc区别?它和其它框架(jquery)的区别是什么?哪些场景适合?

  • 组件之间的传值?

  • Vue 双向绑定原理

  • 描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?

  • 虚拟 DOM 实现原理

  • Vue 中 key 值的作用?

  • Vue 的生命周期

  • Vue 组件间通信有哪些方式?

  • vue 中怎么重置 data?

  • 组件中写 name 选项有什么作用?

  • Vue 的 nextTick 的原理是什么?

  • Vuex 有哪几种属性?

    开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-DZE1iewc-1710707740283)]

Vue

  • 什么是MVVM?

  • mvvm和mvc区别?它和其它框架(jquery)的区别是什么?哪些场景适合?

  • 组件之间的传值?

  • Vue 双向绑定原理

  • 描述下 vue 从初始化页面–修改数据–刷新页面 UI 的过程?

  • 虚拟 DOM 实现原理

  • Vue 中 key 值的作用?

  • Vue 的生命周期

  • Vue 组件间通信有哪些方式?

  • vue 中怎么重置 data?

  • 组件中写 name 选项有什么作用?

  • Vue 的 nextTick 的原理是什么?

  • Vuex 有哪几种属性?

    开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值