面试复习题- http

170 阅读7分钟

✊不积跬步,无以至千里;不积小流,无以成江海

GET 和 POST 的区别有哪些?

区别一:幂等性

即操作重复很多次也不影响结果,即为幂等。

  1. 由于 GET 是读,POST 是写,所以 GET 是幂等的,POST 不是幂等的。

  2. 由于 GET 是读,POST 是写,所以用浏览器打开网页会发送 GET 请求,想要 POST 打开网页要用 form 标签。

  3. 由于 GET 是读,POST 是写,所以 GET 打开的页面刷新是无害的,POST 打开的页面刷新需要确认。

  4. 由于 GET 是读,POST 是写,所以 GET 结果会被缓存,POST 结果不会被缓存。

  5. 由于 GET 是读,POST 是写,所以 GET 打开的页面可被书签收藏,POST 打开的不行。

区别二:请求参数

  1. 通常,GET 请求参数放在 url 里,POST 请求数据放在 body(消息体)里。

  2. GET 比 POST 更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

  3. GET 请求参数放在 url 里是有长度限制的,而 POST 放在 body 里没有长度限制。

区别三:TCP packet

  1. GET 产生一个 TCP 数据包;POST 产生两个或以上 TCP 数据包。

总结

其实最本质的区别是语义上的区别。即一个读,一个写;一个会被缓存,一个不会缓存。剩下所有的功能都是因为这两个推导出来的。

HTTP缓存有哪些方案

主要分为强缓存和弱缓存。

截屏2024-03-10 22.17.25.png

在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(安全层)

区别列表

  1. HTTP 是明文传输的,不安全;HTTPS 是加密传输的,非常安全。

  2. HTTP 使用 80 端口,HTTPS 使用 443 端口。

  3. HTTP 较快,HTTPS 较慢。

  4. HTTPS 的证书一般需要购买(但也有免费的),HTTP 不需要证书。

HTTP/1.1 和 HTTP/2 的区别有哪些?

区别列表

  1. HTTP/2 使用了二进制传输,而且将 head 和 body 分成帧来传输;HTTP/1.1 是字符串传输。

  2. HTTP/2 支持多路复用,HTTP/1.1 不支持。多路复用简单来说就是一个 TCP 连接从单车道(不是单行道)变成了几百个双向通行的车道,2同时可以支持几百个tcp请求同时进行。

  3. HTTP/2 可以压缩 head,但是 HTTP/1.1 不行。

  4. HTTP/2 支持服务器推送,但 HTTP/1.1 不支持。

TCP三次握手四次挥手是什么

建立 TCP 连接时 server 与 client 会经历三次握手

  1. 浏览器向服务器发送 TCP 数据:SYN(seq=x)

  2. 服务器向浏览器发送 TCP 数据:ACK(seq=x+1) SYN(y)

  3. 浏览器向服务器发送 TCP 数据:ACK(seq=y+1)

截屏2024-03-10 22.38.32.png

关闭 TCP 连接时 server 与 client 会经历四次挥手

  1. 浏览器向服务器发送 TCP 数据:FIN(seq=x)

  2. 服务器向浏览器发送 TCP 数据:ACK(seq=x+1)

  3. 服务器向浏览器发送 TCP 数据:FIN(seq=y)

  4. 浏览器向服务器发送 TCP 数据:ACK(seq=y+1)

截屏2024-03-10 22.40.33.png

为什么 2、3 步骤不合并起来呢?

答案:2、3 中间服务器很可能还有数据要发送,不能提前发送 FIN。

说说同源策略和跨域

同源策略

同源策略是什么?

如果两个 URL 的协议、端口和域名都完全一致的话,则这两个 URL 是同源的。

同源策略怎么做?

只要在浏览器里打开页面,就默认遵守同源策略。

优点

保证用户的隐私安全和数据安全。

缺点

很多时候,前端需要访问另一个域名的后端接口,会被浏览器阻止其获取响应。比如甲站点通过 AJAX 访问乙站点的 /money 查询余额接口,请求会发出【且可以发出去】,但是响应会被浏览器屏蔽。

怎么解决缺点

使用跨域手段。

  1. JSONP(缺点,无用户认证+post)

    a. 甲站点利用 script 标签可以跨域的特性,向乙站点发送 get 请求。

    b. 乙站点后端改造 JS 文件的内容,将数据传进回调函数。【必须由后端改造】

    c. 甲站点通过回调函数拿到乙站点的数据。

  2. CORS 跨域名资源分享方案

    a. 对于简单请求,乙站点在响应头里添加 Access-Control-Allow-Origin:http://甲站点 即可。

    b. 对于复杂请求,如 PATCH,乙站点需要:

    1. 先响应 OPTIONS 请求,在响应中添加如下的响应头
    2. 再响应 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 。

  1. Nginx 代理 / Node.js 代理

    a. 前端 ⇒ 后端 ⇒ 另一个域名的后端

Cookie、Session、LocalStorage、SessionStorage 的区别

  • cookie:存储在客户端浏览器中,可以设置过期时间。分为会话cookie(浏览器关闭即失效)和永久cookie(有过期时间)。存在跨域限制。
  • localStorage:存储在客户端浏览器中,数据永久保存,除非手动清除。存在跨域限制。
  • sessionStorage:存储在客户端浏览器中,数据在浏览器关闭时清除。存在跨域限制。

Cookie V.S. LocalStorage

  1. 主要区别是 Cookie 会被发送到服务器,而 LocalStorage 不会,即cookie刷新页面原有的需求也不会变

  2. Cookie 一般最大 4k,LocalStorage 可以用 5Mb 甚至 10Mb(各浏览器不同)

LocalStorage V.S. SessionStorage

  1. LocalStorage 一般不会自动过期(除非用户手动清除)

  2. SessionStorage 在回话结束时过期,会自动清空(如关闭浏览器之后,具体由浏览器自行决定)

Cookie V.S. Session

  1. Cookie 存在浏览器的文件里,Session 存在服务器的文件里

  2. Session 是基于 Cookie 实现的,具体做法就是把 SessionID 存在 Cookie 里

Session V.S. SessionStorage

  1. Session 存储在服务器端,而 SessionStorage 存储在浏览器端的内存中。

  2. Session 的有效期由服务器端设置,可以是会话期(关闭浏览器后失效)或持久性(直到过期时间或被手动删除)。SessionStorage 的有效期是会话期,关闭浏览器后失效。