概念

Session用于记录客户状态的一种机制,不同于Cookie的是,Cookie存储在客户端,而Session则将数据存储在服务器上

Session 的用途

session 运行在服务器端,当客户端第一次访问服务器时,可以将客户的登录信息保存
当客户访问其他页面时,可以判断客户的登录状态,做出提示,相当于登录拦截
session 可以和 Redis 或者数据库等结合做持久化操作,当服务器挂掉时也不会导致某些客户信息(购物车)丢失

工作原理
  1. 当浏览器访问服务器并发送第一次请求时,服务器端会创建一个 session 对象,生成一个类似于key,value 的键值对
  2. 将 key(cookie)返回到浏览器(客户)端,浏览器下次再访问时,携带 key(cookie),找到对应的 session(value)
  3. 最后将存在session中的信息返回到页面上
使用
  1. 项目中安装express-session和connect-mongo
    npm install express-session --save session插件
    npm install connect-mongo --save session数据存储到数据库
    Node.js:使用session存储用户信息_C

  2. 代码中使用
    ① 引入express-session

    let session = require('express-session');
    

    Node.js:使用session存储用户信息_服务器_02

    ② 引入connect-mongo用于express连接数据库存储session:结束数据库实现session持久化

    let mongoStore  = require('connect-mongo')(session);
    

    ③ 中间件使用session

    app.use(session({
        secret:'itlike',//加密字符串
        name:'likeid',//返回客户端key的名称,默认为connect_sid
        resave:false,//强制保存session,即使它没有变化
        saveUninitialized:true,//强制将未初始化的session存储。当新建一个session且未设定属性或值时,它就处于未初始化状态。在设定cookie前,这对于登录验证,减轻服务器存储压力,权限控制是有帮助的,默认为true
        cookie: {maxAge: 24 * 3600},//一天
        rolling: false, //在每次请求时进行设置cookie,将重置cookie过期时间
        store:new mongoStore({//将session数据存储到mongo数据库中
            url:'mongodb://localhost:27017/college', //数据库地址
            touchAfter:24*3600  //多长时间往数据库中更新存储一次,除了在会话数据上更改了某些数据除外
        })
    }));
    

    ④ 配置好后,在用户登录的时候,进行存储session;在一些需要登录才能访问的界面,需要取session,如果没有,则跳转到登录界面;用户退出,需要销毁session

    1. 获取session

      req.session
      

      配置好中间件后,就可以在服务器端,使用req.session获取session了
      Node.js:使用session存储用户信息_服务器_03

    2. 设置session

      req.session.token = 'itlike'
      ```![在这里插入图片描述](https://img-blog.csdnimg.cn/20201203124557129.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0thaVNhckg=,size_16,color_FFFFFF,t_70)
      
    3. 销毁session
      ① 方法一:将cookie的时间设置为0,只有cookie中携带的信息通过客户端请求传到服务器,有对应的session接收session才起作用。
      cookie没了session自然也就将不起作用。
      ② 方法二req.session.destory()

      req.session.destory((err)=>{
      	console.log(err);
      })
      

      Node.js:使用session存储用户信息_客户端_04