前端必须懂的计算机网络知识—(跨域、代理、本地存储)

前端必须懂的计算机网络知识系列文章:

  • DNS服务器和跨域问题
  • 计算机网络的分层模型
  • IP地址和MAC地址
  • 前端必须懂的计算机网络知识—(跨域、代理、本地存储)
  • 前端必须懂的计算机网络知识—(TCP)
  • 前端必须懂的计算机网络知识—(HTTP)
  • 前端必须懂的计算机网络知识—(XSS、CSRF和HTTPS)

网络模型数据处理过程

模型数据处理过程

域名的空间结构:

域名
由于IP地址不方便记忆,所以同样用具有层次和唯一性的域名和IP一一映射

DNS查找过程

  1. 客户端向本地域名服务器发出请求,请求www.baidu.com的IP地址
  2. 本地DNS服务器向DNS根服务器发出请求,根DNS服务器会告诉本地服务器(.com)的服务器地址
  3. 本地DNS服务器会向(.com域)发请求,会得到(baidu.com)的服务器地址
  4. 本地DNS服务器会向(baidu.com)发请求,会得到(www.baidu.com)的IP地址61.135.169.125
  5. 本地DNS服务器向客户端回复域名(www.baidu.com)对应的IP地址是61.135.169.125

同源策略和跨域

浏览器只对网络请求有同源限制,同源就是协议、域名和端口号一致,不同源的客户端脚本在没有明确授权的情况下,不能读写对方XHR资源,反之不同源脚本读取对方XHR资源就是跨域。以http://www.a.com/test/index.html 的同源检测举例:

  • http://www.a.com/dir/page.html ----成功
  • http://child.a.com/test/index.html ----失败,域名不同
  • https://www.a.com/test/index.html ----失败,协议不同(https)
  • http://www.a.com:8080/test/index.html ----失败,端口号不同

跨域的解决方案

  • jsonp:只支持GET,不支持POST请求,不安全XSS
  • postMessage:配合使用iframe,需要兼容IE6、7、8、9
  • document.domain:仅限于同一域名下的子域
  • cors:需要后台配合进行相关的设置
  • websocket:需要后台配合修改协议,不兼容,需要使用socket.io
  • proxy:使用代理去避开跨域请求,需要修改nginx、apache等的配置

jsonp

  • 浏览器对script标签src属性、link标签ref属性和img标签src属性没有同源策略限制,利用这个“漏洞”就可以很好的解决跨域请求,JSONP就是利用了script标签无同源限制的特点来实现的。
  • 当向第三方站点请求时,我们可以将此请求放在script标签的src属性里,这就如同请求一个普通的JS脚本,可以自由的向不同的站点请求。
//创建script发送请求
//请求返回执行cb函数,并且删除创建的script
//类似于$ajax中的jsonp
function jsonp(url,params,cb){return new Promimse((resolve,reject)=>{window[cb] = function(data){resolve(data);document.body.removeChild(script);}params={...params,cb},let arrs=[];for(let key in params){arrs.push(`${key}=${params[key]}`)}let script = document.createElement('script');script.src= url   '?'  arrs.join('&');document.body.appendChild(script);})
}
jsonp({url:'https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su',params:{wd:跨域},cb:'show'}).then(data=>{console.log(data)    })

jsonp

  1. 输入https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=跨域&&cb=show
  2. 返回show({q:"跨域",p:false,s:["跨域请求","跨域访问","跨域问题","跨越速运单号查询","跨域ajax","跨越物流","跨越","跨域速运","跨域请求解决方案","跨域问题怎么解决"]});

postMessage

配合iframes使用,假设a.html位于服务localhost:3000,b.html位于服务器localhost:4000

//a.html
<body><iframe id="frame"  src="http://localhost:4000/b.html" frameborder="0" οnlοad="load()"></iframe><script>function load(){let frame = document.getElementById('frame');frame.contentWindow.postMessage('我很帅','http://localhost:4000');window.onmessage =function (e){console.log(e.data);}}</script>
</body>
//otherWindow.postMessage(message, targetOrigin);
//otherWindow:指目标窗口,也就是给哪个window发消息,是 window.frames 属性的成员或者由 window.open 方法创建的窗口
//message:是要发送的消息,类型为 String、Object (IE8、9 不支持)
//targetOrigin: 是限定消息接收范围,不限制请使用'*'
//注意otherWindow和targetOrigin的区别
//b.html
<body><script>//data:消息//origin:消息来源地址//source:源DOMWindow 对象window.onmessage =function (e){console.log(e.data);e.source.postMessage('不要脸',e.origin);}</script>
</body>

document.domain

//a.html
<body>helloa<iframe id="frame"  src="http://www.kongbz.com/b.html" frameborder="0" οnlοad="load()"></iframe><script>document.domain = 'kongbz.com';//设置domainfunction load(){let frame = document.getElementById('frame');console.log(frame.contentWindow.a)}</script>
</body>
<body>hellob<script>document.domain = 'kongbz.com';//设置domainvar a = 'isB'</script>
</body>

websocket

客户端发送信息给服务端,如果想实现客户端向客户端通信,只能通过页面->服务端->另一个页面

//客户端
<body>hellob<script>let socket = new WebSocket('ws://localhost:3000');socket.onopen = function(){socket.send('我很帅')}socket.onmessage = function(e){console.log(e.data)}</script>
</body>
//服务端
let express = require('express');
let Websocket = require('wss');
let wss= new WebSocket.Server({port:3000})
wss.on('connection',function(ws){ws.on('message',function(data){console.log(data);ws.send('不要脸');})
})
let app = new express();
app.listen(3000)

cors

const http = require('http')
const whitList = ['http://localhost:4000'];
http.createServer(function (req, res) {let origin = req.headers.origin;//在白名单中的域名才能访问if(whitList.includes(origin)){//允许的域名(* 所有域),*不能和Access-Control-Allow-Credentials一起使用res.header("Access-Control-Allow-Origin", "*");//允许携带哪个头访问,不设置不能携带参数res.header("Access-Control-Allow-Headers","ContentType");//允许的方法,不设置默认支持GET、HEAD、POST,其他类型必须设置才能处理请求res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");//运行携带cookie,设置之后还能服务器才能接受cookieres.header("Access-Control-Allow-Credentials",true);//允许前端获取哪个头,不设置浏览器不能解析后台返回的参数res.header("Access-Control-Allow-Expose-Headers",'ContentType');if(req.method=== 'OPTIONS'){res.end()}}
}).listen(9000, function () {console.log('server is runing at 9000')
})

proxy

例如test.a.cn/index.html页面去调用test.b.cn/service.json

//nginx.conf
location / {root;index index.html index.htm;
}
location ~.*\.json {root json;add_header "Access-Control-Allow-Origin" "*";
}

代理和网关

  • 代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端'中间人'的角色,接收客户端发送的请求不改变请求的URI并转发给服务器,同时也接收服务器返回的相应并转发客户端
  • 缓存代理:代理转发响应时会预先将资源缓存在代理服务器上当代理再次接收到对相同资源的请求时,就可以不从源服务器那里获取资源,而是将之前缓存的资源作为响应返回
  • 透明代理:转发请求或响应时,不对报文做任何加工的代理类型
  • 网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理,其工作机制和代理类似,而网关能使通信线路上的服务器提供非HTTP协议的服务。

反向代理

  • 大家都有过这样的经历,拨打10086客服电话,可能一个地区的10086客服有几个或者几十个,你永远都不需要关心在电话那头的是哪一个,叫什么,男的,还是女的,漂亮的还是帅气的,你都不关心,你关心的是你的问题能不能得到专业的解答,你只需要拨通了10086的总机号码,电话那头总会有人会回答你,只是有时慢有时快而已。那么这里的10086总机号码就是我们说的反向代理。客户不知道真正提供服务人的是谁。
  • 反向代理隐藏了真实的服务端,当我们请求 www.baidu.com 的时候,就像拨打10086一样,背后可能有成千上万台服务器为我们服务,但具体是哪一台,你不知道,也不需要知道,你只需要知道反向代理服务器是谁就好了,www.baidu.com 就是我们的反向代理服务器,反向代理服务器会帮我们把请求转发到真实的服务器那里去。Nginx就是性能非常好的反向代理服务器,用来做负载均衡。

负载均衡和动静分离

  • 负载均衡是反向代理的一种,后端多台服务器,nginx根据权重、压力、带宽的分配服务器,避免等待和拥塞
  • 动静分离是反向代理的一种,后端服务器分为动态资源服务器和静态资源服务器,nginx会根据请求分配服务器,区分处理逻辑,加快响应

cookie、localstroage、sessionstroage的区别

  • Cookie适合存储一些session信息:
    1. cookie限制大小,约4k左右,不适合存储业务数据,尤其是数据量较大的值
    2. 存在有效期,到期自动销毁
    3. cookie会每次随http请求一起发送,浪费宽
    4. cookie设置了domain可以在子域共享跨域
    5. 可以使用爬虫抓取
  • localstroage适合存储应用共享的地址信息等:
    1. 存储数据量大,5M或者更大
    2. 有效期为永久
    3. 不会随http请求一起发送
    4. 不能跨域,但是可以使用postMessage和iframe消除这个影响,例如:cross-storage
    5. 在浏览器的隐私模式下不能读取
    6. 不能被爬虫读取
  • sessionstroage适合存储浏览状态等:
    1. 存储数据量大,5M或者更大
    2. 有效期为到浏览器关闭
    3. 不会随http请求一起发送
    4. 不能被爬虫读取

结语

IT即互联网技术,从事的工作和网络有很大的关系,前端要负责和后台(服务器)进行交互,其必然得经过网络,所以懂点网络知识有很大的帮助。接下来会介绍:

  • TCP
  • HTTP
  • HTTPS

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

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

相关文章

php canvas 前端JS压缩,获取图片二进制流数据并上传

<?php if(isset($_GET[upload]) && $_GET[upload] img){//二进制数据流$data file_get_contents ( php://input ); // 不需要php.ini设置&#xff0c;内存压力小if(empty($data)){$data gzuncompress ( $GLOBALS [HTTP_RAW_POST_DATA] ); // 需要php.ini设…

cordova监听事件中调用其他方法_Laravel模型事件的实现原理详解

模型事件在 Laravel 的世界中&#xff0c;你对 Eloquent 大多数操作都会或多或少的触发一些模型事件&#xff0c;下面这篇文章主要给大家介绍了关于Laravel模型事件的实现原理&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;需要的朋友可以参考借鉴。前言Laravel的ORM…

【译】10个有趣的JSCSS库(2018.10)

Tutorialzine每月都会给我们精心挑选优秀的web开发资源&#xff0c;这些资源可以帮助我们解锁最新和最炫酷的网络开发姿势。前端er,让我们一起先睹为快吧&#xff01; WatermelonDB WatermelonDB是用于构建React和React Native应用程序的下一代数据库。快速&#xff0c;高度可…

自定义分页器

好久没来写东西那&#xff01;今天写个自定义分页器给大家参考下吧 首先我们在自己创建的Django项目的app下新建一个utils文件夹&#xff0c;用来放我们的分页器组件 简单说下分页器实现原理&#xff1a; 1.利用ORM查询语句的限制数据条数来确定每页显示的数据 2.设置我们每页显…

五 Vue学习 首页学习 (上)

首页&#xff1a; http://localhost:8002/#/&#xff0c; 登录页面如下&#xff1a; index.js文件中如下的路由配置&#xff0c;转过去看login.vue是如何实现的。 const routes [ { path: /, component: login },&#xff08;这里一个问题&#xff1a; logi…

linux下mqm添加用户,Linux 下MQ的安装和配置亲测

开篇之前奉上几条黄金链接&#xff1a;MQ参考文档http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0m0/index.jsp?topic%2Fcom.ibm.mq.doc%2Fhelp_home_wmq.htmhttp://www-01.ibm.com/support/docview.wss?uidswg27006467MQ下载地址&#xff1a;http://www-03.ibm.com/so…

小程序tabbar这套方案全搞定!

关于微信小程序的tarbar&#xff0c;相信你们都不会陌生 在实现小程序微信原装的tabbar却比较呆板&#xff0c;不够精致&#xff0c;往往不符合自己的要求 这个时候怎么办呢 这套方案接着&#xff01; 先简单的来说一下主要思想:自定义字体图标组件以及tabbar组件&#xff0c…

linux服务器用哪个面板好,Linux服务器管理面板哪家比较好用?

Linux服务器管理面板哪家比较好用&#xff1f;发布时间&#xff1a;2020-07-21 06:08:33来源&#xff1a;51CTO阅读&#xff1a;261作者&#xff1a;BirdCloud_1022现在&#xff0c;越来越多的站长朋友都会选择服务器用来搭建网站&#xff0c;但是势必需要我们自己搭建WEB环境&…

spring boot(一)入门

目录 spring boot(一)入门一、简介1、微服务的概念2、什么是spring boot3、快速入门4.springboot的快捷部署spring boot(一)入门 一、简介 1、微服务的概念 说起spring boot&#xff0c;我们不得不说一下“微服务”一词的兴起&#xff0c;微服务一词最早起源于2014年&#xff0…

Linux usb bus日志如何打开,从linux usb bus节点来认识usb linux usb认识

首先从linux dmesg来认识usb:<6>[ 19.610046] msm_hsic_host msm_hsic_host: Qualcomm EHCI Host Controller using HSIC<6>[ 19.620391] msm_hsic_host msm_hsic_host: new USB bus registered, assigned bus number 1<6>[ 19.659942] msm_hsic_host …

Spring面试问题

还可以查看我们最新的文章69Spring面试问答-最终名单 。 1&#xff09;什么是春天&#xff1f; 回答&#xff1a; Spring是控件和面向方面的容器框架的轻量级转换。 2&#xff09;解释春天&#xff1f; 回答&#xff1a; 轻巧&#xff1a;在尺寸和透明度方面&#xff0c; S…

201771010120 苏浪浪 《面向对象程序设计(java)》第二周学习总结

理论知识总结 第三章Java基本程序设计结构 1、基本知识&#xff1a;&#xff08;1&#xff09;标识符&#xff1a;是由字母、下划线、美元符号和数字组成&#xff0c;且第一个符号不能为数字。&#xff08;2&#xff09;关键字&#xff1a;剧啊语言中被赋予特定意义的一些单词。…

Apache Camel简介

Apache Camel是著名的企业集成模式的开源实现。 Camel是一个路由和中介引擎&#xff0c;可以帮助开发人员以各种领域特定语言&#xff08;DSL&#xff09;&#xff08;例如Java&#xff0c;Spring / XML&#xff0c;scala等&#xff09;创建路由和中介规则。 骆驼用途广泛 Cam…

qt结构体嵌套结构体方法_9.2 C++结构体类型变量

C定义结构体类型变量的方法 1、先声明结构体类型再定义变量名&#xff0c;在定义了结构体变量后&#xff0c;系统会为之分配内存单元。struct Student{ //自定义结构体变量int num;//学号char sex;//性别int age;//年龄};2、在声明类型的同时定义变量 一般形式为struct 结构体名…

Vue解析--如何应对面试官提问

近期不断面试中&#xff0c;面试官都会提一些关于Vue相关的源码和“全家桶”之类的问题。那么针对这些提问&#xff0c;我们应该如何更好应答呢&#xff1f;在这里我把对Vue的理解整理出来供大家来参考。 1.Vue是什么&#xff1f; Vue是一套构建用户界面的渐进式框架&#xf…

Java开发人员的Erlang

您可能没有注意到&#xff0c;但是距离我上次发布博客已经过去了几个星期。 原因是我的Soleus骨折了&#xff0c;而我的腿也石膏了。 不能动弹&#xff0c;我认为调查完全不同的东西是个好主意–要么看那天的电视&#xff0c;要么&#xff0c;尽管Kojak和Magnum PI的重播很诱人…

20165339第六周学习总结

课本知识点总结 第八章 String类 使用String类声明对象并创建对象 String s new String("We are students"); String t new String("We are students"); String (char a[])用一个字符数组a创建一个String对象 char a[] {J,a,v,a}; String s new String(a)…

keil5用jlink不到芯片_洛达芯片检测

安卓手机下载一个络达官方的刷机软件然后连接上耳机&#xff0c;打开软件&#xff0c;就可以看到耳机芯片的相关信息。软件下载地址&#xff1a;https://pan.baidu.com/s/1MOXjkHv1wfxWWIVdcsMSFg 提取码: tasc我们的耳机都是络达芯片&#xff0c;不怕你检测&#xff0c;希望用…

层次和约束:项目中使用vuex的3条优化方案

问题描述 使用vuex的store的过程中&#xff0c;发现了一些不是很优雅的地方&#xff1a; store层module太多&#xff0c;找state、getter、mutation、action对应的module比较慢。 组件里面mapGetters、mapActions、mapMutations过多&#xff0c;分不清getter、action、mutati…

怎么让员工服从管理_为什么现在的员工执行力和服从性越来越差,管理一严格就辞职?...

当有负面情绪的时候&#xff0c;不要说。管好自己的嘴&#xff0c;有时候做哑巴&#xff0c;是一种境界。现在的企业很多都存在这个问题&#xff0c;员工执行力越来越差&#xff0c;服从性也越来越差&#xff0c;管理者稍微一严格&#xff0c;员工就会辞职走人&#xff0c;留不…