文章目录
前端网络
互联网的起源
- 1969 互联网—Internet(因特网,英特网),网际网络
- 加利福尼亚大学洛杉矶分校
- 斯坦福大学
- 加利福尼亚大学
- 犹他州大学
- 1989
- 欧洲粒子物理研究所—协议(格式)
- WWW(World Wide Web)
- 1991 互联网起源
计算机的联通
冯诺依曼式计算机
——冯诺依曼(计算机之⽗)(图灵 计算机科学之父)
-
运算器:
- CPU(逻辑运算,整数运算), GPU(显卡) (浮点数运算)
-
存储器:
- 内存(断电数据清空**,** 读写速度快)(RAM)
- 硬盘(辅存):(数据可以持久化,读写速度,相对较慢)
-
控制器:
- 主板上的⼀些器件
-
输⼊设备:
- 键盘,⿏标,⻨克⻛,⽹⼝
-
输出设备:
- 显示器,⽿机,⽹⼝
局域网: 一个路由器下的
IP地址
-
IP地址的格式:
- IP地址分为四个段:xxx.xxx.xxx.xxx,每个段0~255,每个段,都是由8个0、1组成的。
-
IP地址的分类:
- ⼀个IP地址分为两个部分:⽹络ID,主机ID
- A类:0.0.0.0 ~ 127.255.255.255(⼀个⽹络能有1600+万台)
- B类:128.0.0.0 ~ 191.255.255.255(172.16.0.0 ~ 172.31.255.255)
- C类:192.0.0.0 ~ 223.255.255.255(192.168.xxx.xxx)
- D类:(多播地址)
- E类
-
细节:
- ip config 查IP地址
域名与DNS解系
-
www.baidu.com->域名
问:能通过域名直接访问到⼀台机器吗?
答:不可以的。 -
⽤域名和IP形成对应关系。
⾸先,计算机是不知道域名对应的IP的。
问路由器,如果路由器认识这个域名,就返回⼀个IP,然后计算机访问这个IP。
如果路由器不认识,他就问上⼀层路由器。
如果问到了城市这个级别的路由器的时候,DNS服务器。
如果DNS服务器不认识这个域名,继续向上级DNS服务器查找。
互联⽹建⽴的时候,13台总的DNS服务器。 -
当向浏览器的地址栏中输⼊⼀个url按回⻋之后,⽹络中都会发⽣什么?(面试经典问题)
⽐如输⼊的是123.xyz
(1)浏览器的缓存。
(2)本机host。C:windows/system32/drivers/etc/host
127.0.0.1(指的是当前的这台机器) localhost
0.0.0.0 (表示不知道IP,默认打到自己的本机地址上)
(3)家⾥路由器
(4)上级路由、城市的LDNS服务器
(5)继续向上级的DNS服务器找。
(6) gDNS服务器。
五层网络模型
五层
- 应用层:HTTP协议,DNS协议
- 运输层:TCP协议(可靠)UDP协议(不可靠)
- 网络层 :IP地址–IP协议
- 数据链路层 :Mac地址(硬件地址)
- 物理层
HTTP协议
请求:Request
- 请求头
- 格式:请求方式 路径 协议版本
请求方式:GET POST(主要的这两种) 还有 HEAD,PUT,DELETE
POST /path?a=1&b=2 HTTP1.1
Host:www.baidu.com
Connection: keep-alive 长链接
User-Agent:asdasdasd (客户端)
Cookie
-
数据体
TCP/IP协议(对方的IP,自己的IP,对方端口)HTTP协议(请求头)
响应:Response
-
响应头
-
数据体
-
格式:协议版本 状态码 message
-
属性:值
cache-control:max-age:86480 缓存一天,在同一天中,如果请求的是一样的,则返回同样的结果
Get和Post请求方式的区别(面试)
-
是基于什么前提的?如果什么前提都没有,不使⽤任何规范,只考虑语法和理论上的HTTP协议。
GET和POST⼏乎没有什么区别,只有名字不⼀样。 -
如果是基于RFC规范的。
(1)理论上的(Specification):GET和POST具有相同语法的,但是有不同的语义。
get是⽤来获取数据的,post是⽤来发送数据的,其他⽅⾯没有区别。
(2)实现上的(Implementation):各种浏览器,就是这个规范的实现者。
常⻅的那些不同:
1)GET的数据在URL是可⻅的。POST请求不显示在URL中。(URL 不一定都在地址栏中)
2)GET对⻓度是有限制的,POST⻓度是⽆限的。
3)GET请求的数据可以收藏为书签,post请求到的数据不可收藏为书签。
4)GET请求后,按后退按钮、刷新按钮⽆影响,post数据会被重新提交。
5)GET编码类型:application/x-www-form-url,post的编码类型:有很多种 如:encodeapplication/x-www-form-urlencoded multipart/form-data
6)GET历史参数会被保留在浏览器⾥,post不会保存在浏览器中的。
7)GET只允许ASCII .post没有编码限制,允许发⼆进制的。
8)GET与POST相⽐,GET安全性较差,因为所发的数据是URL的⼀部分。
Cookie与Session
Cookie(数据存在浏览器)
-
如果我们⽤JS的变量来存数据,那么在⻚⾯关闭的时候,数据就消失了。
-
保持登录状态是怎么做到的呢?
按照正常的HTTP协议来说,是做不到的。
因为HTTP协议,上下⽂⽆关协议。 -
所以说前端⻚⾯上,有可以持久化存储数据的东⻄。⼀旦登录成功,我就记载在这个⾥⾯。
Cookie是有限制的:
Cookie是存在浏览器⾥的,不是存在某个⻚⾯上的。是可以⻓期存储的。Cookie即使是保
存在浏览器⾥,也是存放在不同的域名下的。
Cookie不可以跨域存储 Cookie在关闭浏览器时候是不可以消失的
- 过程
初始状态:没有登录
访问百度的登录,输⼊⽤户名,密码。
如果⽤户名和密码是正确的。百度的后端会向这个域名下,设置⼀个Cookie。写⼊⽤户
的基本信息(加密的)。
以后每⼀次向百度发送请求,浏览器都会⾃动带上这些Cookie。
服务端(后端)看到了带有ID的cookie,就可以解析这个加密的ID,来获取到这个⽤户
本身的ID。
如果能获取到本身的ID,那么就证明这个⽤户已经登录过了。所以后端可以继续保留⽤
户的信息。
缺点:如果某个坏⼈,复制了我浏览器⾥的cookie,他就可以在他的电脑上登录我的账号
了。
XSS注⼊攻击。
Session(数据存在服务器)
![image-20220119120339416](%E5%89%8D%E7%AB%AF%E7%BD%91%E7%BB%9C.assets/image-20220119120339416.png)
数据存在Session上也有缺点
如果⽤户量⾮常⼤,上亿的⽤户。
在⽤户量很⼤的时候,服务器端很耗资源的。
因为后端可能不⽌⼀台服务器,⽤户的登录信息,⼀般只存在⼀台服务器上。
因为⽤户的登录操作,在哪台机器上执⾏的,就⼀般存在哪台机器上。
需要通过反向代理。(轮询,IP哈希。)
页面的正确打开方式
B/S结构 C/S结构
Client/Server——Client只负责内容的展示,Server负责提供内容。
Browser/Server——Browser只负责内容的展示,Server负责提供内容。
www.baidu.com
index.html
⻚⾯的本质就是⼀个字符串。带有HTML格式的字符串。
浏览器 向服务器 请求⼀个⻚⾯的本质是什么?
(1)访问 www.baidu.com
(2)服务器接收到这个请求后,服务器想要把这个⻚⾯的内容(HTML格式的字符串)返回
给浏览器。
(3)⻚⾯的字符串存在哪⾥呢?存在HTML⽂件⾥。例如:index.html
(4)服务器端要读取⽂件。
(5)将读取出来的内容返回给浏览器。最后返回的是⼀个字符串,这个字符串的来源可能是⽂件,可能是缓存,可能来⾃于数据库。
服务器&服务容器
服务器:严格的说,服务器是⼀台计算机,这台计算机,只提供服务。(不是⽤户⽤的)
但是,我们常说的这个服务器,指的是服务容器,不是服务器。
服务容器:是⼀个程序。程序可以监听⼀个端⼝。读取⽂件,并且返回。
如果我们想通过访问服务器(服务容器)的⽅式,来访问我们⾃⼰写的⻚⾯。
我们就得装⼀个服务容器的程序
安装WebServer插件
-
webstorm 直接在右上角的浏览器打开
-
VS
-
sublime ctrl +shift + p 输入 install 打开页面后搜索 Sublime Server
add Folder to protect --> view in …
-
发送网络请求
- 在浏览器中直接输入网址
- location.href = “url”,可以发出请求,但是页面会跳转
- 带有src属性的标签,请求是可以发出的,服务端也可以返回,但是返回之后能否被应用,还要看浏览器(页面无法处理返回结果)
- 带有href 属性的标签 请求是可以发出的,服务端可以处理 返回,返回后是否被应用看浏览器,(页面无法处理返回结果)
- 带有action属性的标签 例 form 表单,可以向后端发出请求,但是form表单发出请求后,页面也会跳转 页面会跳转
- ajax 可以用代码控制,页面不会跳转,服务端返回的结果可以用JS继续处理
<script>
// ajax 要素
/*(1) 请求方式
(2) url
*/
//ajax
// ie6不支持该方法 增加if 语句
var xhr = null;
// 如果该方法存在
if(window.XMLHttpRequest)
{
xhr = new XMLHttpRequest();
}else{
//ie6带的
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
// 渡一准备的接口
// https://developer.duyiedu.com/edu/testJsonp?callback=asd jsonp格式
//http://developer.duyiedu.com/edu/testAjax
//https://developer.duyiedu.com/edu/testAjaxCrossOrigin 不报错
xhr.open("get","https://developer.duyiedu.com/edu/testJsonp?callback=asd ");// 报错
xhr.send();
</script>
跨越问题(ajax)
注意:报错 Control-Allow-Origin
跨域访问资源
哪些东⻄属于资源?
- js⽂件是资源的,但是js⽂件是允许被跨域请求的。css⽂件,jpg,png等。src属性的资源都是可以被跨域请求的。href资源⼤部分都是可以被跨域请求的。
哪些资源算跨域请求的资源?
- 后端接⼝的数据。
- 其它域的cookie
- 其它域的缓存
什么是其它的域?怎么样算跨域?
⻚⾯本身:有协议(http/https),域名,端⼝
要请求的数据:http://www.baidu.com:80
协议,域名,端⼝这三个,有任意⼀个不⼀样就算跨域
跨域这个⾏为,发⽣在哪⾥?
答案:
-
即使跨域了(协议,域名,端⼝号有不⼀样的),请求也可以发出。
-
服务器端也是可以接收的。
-
服务器端也是可以正常处理的。
-
服务器端也是可以正常返回数据。
-
浏览器也能接收到这些数据。
-
接收到之后,发现当前⻚⾯的域和请求的域不同,所以判定为跨域。
-
我们的代码在这等着结果呢,但是因为浏览器判定跨域了,不会把结果传递给我们的代码。
解决跨域问题:
-
后端(别⼈家的)配合我们进⾏跨域。
pan.baidu.com ——> zhidao.baidu.com
(1)JSONP(正常的情况,返回的数据都是JSON格式。JSONP是⼀种特殊的格式。)
(2)后端设置Access-Control-Allow-Origin属性以⽀持跨域。(聊天机器⼈课讲,因为需要nodejs) -
后端不配合我们进⾏跨域。
(3)iframe(只能显示,不能控制)
(4)通过后端代理(⾃⼰的后端)(后⾯聊天机器⼈讲,因为需要nodejs)<iframe src = "https://www.baidu.com"> </iframe>
原生JS发送ajax
<div id="test"></div>
<script>
var xhr = null;
if(window.XMLHttpRequest)
{
xhr = new XMLHttpRequest();
}else{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
console.log(xhr.readyState);//0 刚创建对象 状态为0
//初始化,与服务器建立连接 1
// true false false同步:注意阻塞问题 不传入参数或者参数为true异步:没等到返回结果就继续执行下面的代码表示同时进行
// 在计算机中同步表示串行 异步表示同时进行 可以理解为同线程和异线程
xhr.open("get","https://developer.duyiedu.com/edu/testAjaxCrossOrigin",true);
console.log(xhr.readyState);//1
// 将接受到的结果输出出来当属性变化时候执行
xhr.onreadystatechange = function(){
// readyState == 4 时表示请求完成已经接收到数据
//console.log(xhr.readyState); 2 3 4
//status == 200 网络请求都会有一个状态码,俩表示这个请求 200 请求成功
// http 状态码 2** 表示成功 3** 表示重定向 4** 客户端错误 404 页面为找到 5** 服务端错误
if(xhr.readyState == 4 && xhr.status == 200)
{
//console.log(xhr.responseText);
document.getElementById("test").innerText = xhr.responseText;
// 转化为jsonp 对象
var data = JSON.parse(xhr.responseText);
console.log(data);
}
}
// 先把方法赋值上 在send
xhr.send();
JSONP 的使用与特性
<script src="jquery.js"></script>
<script>
//jsonp格式哪里特殊?
//发送的时候,会带上一个参数callback
//返回的结果不是json
//callback的名 + ( + json + );
$.ajax({
url: "http://developer.duyiedu.com/edu/testJsonp",
type: "get",
dataType: "jsonp",
success: function (data) {
console.log(data);
}
});
//jsonp跨域,只能使用get方法,如果我们设置的是post方法,jquery会自动转为get方法。
//是不是在jsonp里面我只能使用get方法?是不是我设置的post方法都会转为get方法?
//不是。
//jquery会先判断是否同源,如果同源,那么设置的是get就是get,设置的post就是post
//如果不是同源,无论设置的什么,都改为get. 同源有没有跨越
</script>
JSONP原理
为什么实现JSONP
- 因为从一个接口获取一个数据,但是这个接口和当前页面不是同源的。(也就是跨域了)但是这个接口是支持JSONP的。
- script标签,有src属性,所以可以发出网络请求,script标签,虽然可以引用其他域的资源,浏览器不限制。,但是,浏览器会将返回的内容,作为js代码执行。
- asd({“status”:“ok”,“msg”:“Hello! There is DuYi education!”}),相当于调用了asd方法,传入了一个json对象作为参数。
jsonp 原理
- 判断请求与当前页面的域,是否同源,如果同源则发送正常的ajax,就没有跨域的事情了。
2. 如果不同源,生成一个script标签
3. 生成一个随机的callback名字,还得创建一个名为这个的方法。
4. 设置script标签的src,设置为要请求的接口。(标签属性的请求都是get)
5. 将callback作为参数拼接在后面。
以上是前端部分====
6. 后端接收到请求后,开始准备要返回的数据
7. 后端拼接数据,将要返回的数据用callback的值和括号包裹起来
例如:callback=asd123456,要返回的数据为{“a”:1, “b”:2},
就要拼接为:asd123456({“a”:1, “b”:2});
8. 将内容返回。
以上是后端部分====
9. 浏览器接收到内容,会当做js代码来执行。
10. 从而执行名为asd123456的方法。这样我们就接收到了后端返回给我们的对象。
<script>
var $ = {
// 有一个方法叫ajax 参数为options
ajax: function (options) {
var url = options.url;
//get post
var type = options.type;
// json jsonp
var dataType = options.dataType;
//判断是否同源(看协议 域名 端口号)
// 获取URL 的域
var targetProtocol = ""; // 目标接口的协议
var targetHost = ""; // host 是包含域名和端口号
/* 判断是否存在http://或者 https://
如果url 不带http 那么访问的一定是相对路径,但相对路径一定是同源的
*/
if (url.indexOf("http://") == 0 || url.indexOf("https://") == 0) {
// 获取目标源和目标协议
var targetUrl = new URL(url);
targetProtocol = targetUrl.protocol;
targetHost = targetUrl.host;
}
// 否则的话是同源的
else {
targetProtocol = location.protocol;
targetHost = location.host;
}
// 判断是否是JSONP;不是jsonp 不用做其他判断 直接发送ajax;
if (dataType == "jsonp") {
// 看是否同源
// 表示同源
if (location.protocol == targetProtocol && location.host == targetHost){
//此处省略。因为同源,jsonp会当做普通的ajax做请求
} else { // 表示不是同源
// 随机生成 callback Math.floor() 返回小于或等于一个给定数字的最大整数。
var callback = "ab" + Math.floor(Math.random());
//给window上添加一个方法
window[callback] = options.success;
// 生成script标签
var script = document.createElement("script");
if (url.indexOf("?") > 0) { //表示已经有参数了
script.src = url + "&callback=" + callback;
} else { //表示没有参数
script.src = url + "?callback=" + callback;
}
script.id = callback;
document.head.appendChild(script);
}
}
}
}
$.ajax({
url: "http://developer.duyiedu.com/edu/testJsonp",
type: "get",
//T大写
dataType: "jsonp",
success: function (data) {
console.log(data);
}
});
</script>
}
script.id = callback;
document.head.appendChild(script);
}
}
}
}
$.ajax({
url: "http://developer.duyiedu.com/edu/testJsonp",
type: "get",
//T大写
dataType: "jsonp",
success: function (data) {
console.log(data);
}
});
</script>