✊不积跬步,无以至千里;不积小流,无以成江海
GET 和 POST 的区别有哪些?
区别一:幂等性
即操作重复很多次也不影响结果,即为幂等。
-
由于 GET 是读,POST 是写,所以 GET 是幂等的,POST 不是幂等的。
-
由于 GET 是读,POST 是写,所以用浏览器打开网页会发送 GET 请求,想要 POST 打开网页要用 form 标签。
-
由于 GET 是读,POST 是写,所以 GET 打开的页面刷新是无害的,POST 打开的页面刷新需要确认。
-
由于 GET 是读,POST 是写,所以 GET 结果会被缓存,POST 结果不会被缓存。
-
由于 GET 是读,POST 是写,所以 GET 打开的页面可被书签收藏,POST 打开的不行。
区别二:请求参数
-
通常,GET 请求参数放在 url 里,POST 请求数据放在 body(消息体)里。
-
GET 比 POST 更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
-
GET 请求参数放在 url 里是有长度限制的,而 POST 放在 body 里没有长度限制。
区别三:TCP packet
- GET 产生一个 TCP 数据包;POST 产生两个或以上 TCP 数据包。
总结
其实最本质的区别是语义上的区别。即一个读,一个写;一个会被缓存,一个不会缓存。剩下所有的功能都是因为这两个推导出来的。
HTTP缓存有哪些方案
主要分为强缓存和弱缓存。
在HTTP1.1的强缓存中,通过cache control的头写入max age 3600, 则会进行一个长达一小时的缓存。在这一个小时之内,无论是谁访问同样的url,都不会再发送新的请求。
在HTTP1.1的弱缓存中,由于强缓存存储了一个etag头,则在弱缓存中利用none-Match来确认是否要删除etag对应的文件。如果返回的是304,则不删除继续用;如返回的是200,则删除并返回最新的。
在HTTP1.0的强缓存中,制定了固定时间会失效。但有个bug就是如果用户系统时间错乱则可能会提前失效。1.0中会指定最后修改的(更新的)时间为etag。
在HTTP1.0的弱缓存中,利用上次修改的时间来确认是否要删除etag对应的文件。如果返回的是304,则不删除继续用;如返回的是200,则删除并返回最新的。
- 强缓存与弱缓存: HTTP缓存主要分为强缓存和协商缓存。强缓存由Expires和Cache-Control控制,协商缓存由Last-Modified和Etag控制。
- Cache-Control: 这是一个非常重要的头字段,可以用来控制缓存的行为,如缓存的最大有效期、是否可以缓存等。
举例:
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:00:05 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "3f80-1abcde123ab"
Accept-Ranges: bytes
Content-Length: 882
Content-Type: text/html
在上面的响应头中:
Last-Modified表示资源最后修改的时间。ETag是资源的唯一标识。Content-Length表示响应实体的长度,即HTML文档的大小。
HTTP 和 HTTPS的区别
HTTPS = HTTP + SSL/TLS(安全层)
区别列表
-
HTTP 是明文传输的,不安全;HTTPS 是加密传输的,非常安全。
-
HTTP 使用 80 端口,HTTPS 使用 443 端口。
-
HTTP 较快,HTTPS 较慢。
-
HTTPS 的证书一般需要购买(但也有免费的),HTTP 不需要证书。
HTTP/1.1 和 HTTP/2 的区别有哪些?
区别列表
-
HTTP/2 使用了二进制传输,而且将 head 和 body 分成帧来传输;HTTP/1.1 是字符串传输。
-
HTTP/2 支持多路复用,HTTP/1.1 不支持。多路复用简单来说就是一个 TCP 连接从单车道(不是单行道)变成了几百个双向通行的车道,2同时可以支持几百个tcp请求同时进行。
-
HTTP/2 可以压缩 head,但是 HTTP/1.1 不行。
-
HTTP/2 支持服务器推送,但 HTTP/1.1 不支持。
TCP三次握手四次挥手是什么
建立 TCP 连接时 server 与 client 会经历三次握手
-
浏览器向服务器发送 TCP 数据:SYN(seq=x)
-
服务器向浏览器发送 TCP 数据:ACK(seq=x+1) SYN(y)
-
浏览器向服务器发送 TCP 数据:ACK(seq=y+1)
关闭 TCP 连接时 server 与 client 会经历四次挥手
-
浏览器向服务器发送 TCP 数据:FIN(seq=x)
-
服务器向浏览器发送 TCP 数据:ACK(seq=x+1)
-
服务器向浏览器发送 TCP 数据:FIN(seq=y)
-
浏览器向服务器发送 TCP 数据:ACK(seq=y+1)
为什么 2、3 步骤不合并起来呢?
答案:2、3 中间服务器很可能还有数据要发送,不能提前发送 FIN。
说说同源策略和跨域
同源策略
同源策略是什么?
如果两个 URL 的协议、端口和域名都完全一致的话,则这两个 URL 是同源的。
同源策略怎么做?
只要在浏览器里打开页面,就默认遵守同源策略。
优点
保证用户的隐私安全和数据安全。
缺点
很多时候,前端需要访问另一个域名的后端接口,会被浏览器阻止其获取响应。比如甲站点通过 AJAX 访问乙站点的 /money 查询余额接口,请求会发出【且可以发出去】,但是响应会被浏览器屏蔽。
怎么解决缺点
使用跨域手段。
-
JSONP(缺点,无用户认证+post)
a. 甲站点利用 script 标签可以跨域的特性,向乙站点发送 get 请求。
b. 乙站点后端改造 JS 文件的内容,将数据传进回调函数。【必须由后端改造】
c. 甲站点通过回调函数拿到乙站点的数据。
-
CORS 跨域名资源分享方案
a. 对于简单请求,乙站点在响应头里添加
Access-Control-Allow-Origin:http://甲站点即可。b. 对于复杂请求,如 PATCH,乙站点需要:
- 先响应 OPTIONS 请求,在响应中添加如下的响应头
- 再响应 POST 请求,在响应中添加
Access-Control-Allow-Origin头。
Access-Control-Allow-Origin: https://甲站点
Access-Control-Allow-Methods: POST, GET, OPTIONS, PATCH
Access-Control-Allow-Headers: Content-Type
c. 如果需要附带身份认证信息,JS 中需要在 AJAX 里设置 xhr.withCredentials = true 。
-
Nginx 代理 / Node.js 代理
a. 前端 ⇒ 后端 ⇒ 另一个域名的后端
Cookie、Session、LocalStorage、SessionStorage 的区别
- cookie:存储在客户端浏览器中,可以设置过期时间。分为会话cookie(浏览器关闭即失效)和永久cookie(有过期时间)。存在跨域限制。
- localStorage:存储在客户端浏览器中,数据永久保存,除非手动清除。存在跨域限制。
- sessionStorage:存储在客户端浏览器中,数据在浏览器关闭时清除。存在跨域限制。
Cookie V.S. LocalStorage
-
主要区别是 Cookie 会被发送到服务器,而 LocalStorage 不会,即cookie刷新页面原有的需求也不会变
-
Cookie 一般最大 4k,LocalStorage 可以用 5Mb 甚至 10Mb(各浏览器不同)
LocalStorage V.S. SessionStorage
-
LocalStorage 一般不会自动过期(除非用户手动清除)
-
SessionStorage 在回话结束时过期,会自动清空(如关闭浏览器之后,具体由浏览器自行决定)
Cookie V.S. Session
-
Cookie 存在浏览器的文件里,Session 存在服务器的文件里
-
Session 是基于 Cookie 实现的,具体做法就是把 SessionID 存在 Cookie 里
Session V.S. SessionStorage
-
Session 存储在服务器端,而 SessionStorage 存储在浏览器端的内存中。
-
Session 的有效期由服务器端设置,可以是会话期(关闭浏览器后失效)或持久性(直到过期时间或被手动删除)。SessionStorage 的有效期是会话期,关闭浏览器后失效。