宏任务 微任务 cookie session

686 阅读4分钟

当同步任务执行完毕后,先去等待任务队列中的所有的微任务找出来,挨个执行,当微任务执行完毕,再把所有的宏任务执行;

微任务

  • Promise 的 then
  • async 函数中 await 后面的代码;
  • process.nextTick

宏任务

定时器 setInterval 和 setTimeout

async 和 await ES6新增关键字 将异步程序转为同步

  • async 在函数定义时使用,用 async 函数声明的函数默认返回一个 promise 实例,返回值可以直接 .then
  • await 右边如果是 Promise 就等着 Promise 状态发生变更,如果是同步代码直接执行;如果 await 执行的方法返回的 promise 对象,我们可以直接在对象使用 then 方法;此外,await 下面的代码都会变成微任务

cookie 是 http 协议的一部分,不属于客户端也不属于服务端;

  • cookie 存储在客户端 但是服务端和客户端都可以操作cookie
  • cookie 用于记录用户的信息,并且在每次请求服务器的时候都会自动带上 cookie 的信息;等服务器接收到请求就可以从 cookie 获取到用户的信息,从这些信息中获知用户是否登录;

js操作 cookie

  1. 获取 cookie document.cookie
  2. 设置 cookie document.cookie = 'key = value'
  3. 设置 cookie 是=时需要注意
    • cookie 是个字符串,并且值要写成 'key=value;'的形式;
    • cookie 设置可以同名,后面的并不会覆盖前面的

cookie 属性

  • domain 当前可以访问 cookie 的域
  • path 可以访问当前 cookie 的路径,一般设置为 / 表示根目录; 这个路径的子级可以访问上面的,但是高层级的路径不能访问低层级的 cookie;例如 path 设置为/a ,/a/b 可以使用/a的 cookie;但是如果设置为 /a/b,/a就不能使用 /a/b 的 cookie;
  • expires: cookie 的过期时间,cookie 都是有时效的,是个 GMT 时间,如果超过这个时间,cookie 失效,浏览器会删除它;(这也是删除 cookie 的原理,将 cookie 的过期时间设置为一个过去的时间,一般设置为 1970 年)
  • maxAge cookie 有效期,和 expires 不同,这个是一个以毫秒为单位的绝对时间,如 1000ms 或者 5000ms;(这个东西只能服务端设置)
  • http-only: 表示该属性只能由 http 使用,不允许客户端通过 js 代码操作;

session 服务端技术 会话控制

和 cookie 不同,session 是保存在服务器上的,而且并不会随着 http 传递;因为 cookie 保存在客户端,还是很不安全的,服务器为了杜绝这种事情,在服务器上也搞了一个存储用户信息的东西,这就是 session。一般用于用户的登录状态,用户 id 等敏感信息的保存; cookie 中保存着 session 的 id,在 http 请求中会带着 cookie 请求,服务器从 cookie 中获取 session 的 id

1. 以登录为例,当我们登录后,服务端会在 cookie 中设置当前用户的登录状态为已经登录,
2. 同时在服务器上生成一份 session 文件,session 中存储用户 id,登录状态的有效期限等;这个 session 文件有一个 id,生成 session 文件后,服务器还会把 session-id 写进 cookie。然后返回给客户端,此时用户的客户端收到的 cookie 中包含登录状态和 session-id;
3. 等下一次再去请求时,http 协议会自动带着所有的 cookie 去请求;等服务器收到请求后,从 cookie 中把用户信息拿出来,然后再根据 session-id 把 session 读取出来,再从 session 中查询登录状态,如果登录状态有效,就继续正常的响应,否则就返回登录失效的状态,要求用户登录;

token 令牌 身份校验机制 是一个字符串,这个字符串一般是加密过的,一般包含了用户 id,登录的时间戳,以及 sign (签名,生成 token 的前几位进行加密的结果,可以防止 token 被篡改,一旦篡改了后面这一段和前面的对不上了);

  • 一般在用户登录时,客户端把用户的用户名和密码传递给服务器,服务端进行校验,如果没有问题,就会生成一个 token;
  • 生成 token 后,服务器把 token 返回给前端,然后前端下次请求的时候需要带上这个 token,然后服务端在接收到请求后会首先校验这个 token 是否有效,如果有效继续受理请求,如果无效则直接拒绝;

使用token的方式

  1. 服务端也可以直接把 token 写进 cookie 中,下次客户端发起请求时会自动带上;
  2. 服务端也可以作为数据返给前端,但是前端此时需要手动的保存 这个 token,可以保存在 localStorage 中,下次发请求时从 ls 中取出作为参数传给服务器即可
  3. 服务端返回 token 后,客户端可以把这个 token 写进请求头中,然后服务端每次从请求头中获取; 具体使用哪一种,需要和服务端商定;