nodejs-express用户登录状态保持

692 阅读4分钟

cookie-session 登陆状态保存

http协议是无状态的

多次请求之间没有关系cookie 知识点: 登录状态保持 [登录拦截] 当用户在访问服务的其他页面时, 先进行拦截, 要先判断此用户之前是否登录过, 如果登陆过就放行,如果没有登录, 去登陆!

需要了解的两个知识点:

  1. http协议是无状态的
  2. cookie 和 session
  3. 实现登录拦截
1. http协议是无状态的
2. http协议是无记忆无状态
    在早期的互联网中, 服务器中存放都是静态页面, 用于展示新闻, 图片信息, 用户只需输入正确网址,即可访问服务器, 此时 服务器是不需要区分用户的;也不会记住用户状态 ,就叫  http协议是无记忆无状态; 

    后来、随着互联网发展, 出现一些会员制网址: 博客、 相亲网址、 购物网站、 此时 服务器就需要区分用户了!
    服务器为了区分用户, 新增cookie和session 技术 来实现服务器 区分用户功能;


    http协议是无状态, 在一次请求响应之后,服务器会销毁用户状态, 
    http协议是无状态的: 两次请求之前 毫无关系; 

2- 使用cookie 和 session 来实现服务器区别用户

cookie  浏览器中存储数据的容器 
特点: 容量小 操作不方便  在每次请求服务器是, cookie数据会自动添加请求报文,发送给服务器
session 服务器中存储数据容器 


  cookie和 session 如何实现区别用户: 

 用户第一次访问服务器,服务器为了区分用户,会给当前用户 开辟单独session空间,来存放用户的信息,还会给用户生成唯一的标识123, 并会把标识123通过响应报文,传递给浏览器的cookie;  

 用户第二次访问服务器, 用户会携带cookie中标记 去服务器, 服务器直接根据cookie中标记就区分用户了;

session:  1- 开辟空间 记录用户信息 , 2- 给每个用户生成唯一标识
cookie:   1- 存放标记, 2- 把标记发送给服务器 

3- 登录拦截: 当用户在访问服务的其他页面时, 先进行拦截, 要先判断此用户之前是否登录过, 如果登陆过就放行,如果没有登录, 去登陆!

  1- 在用户登录成功时, 给登陆成功用户, 在服务器的session中添加登录成功标记 
  2- 在用户访问服务器的其他页面,  要先判断此用户之前是否登录过(就看此用户session中是否有登陆成功标识) 
    有登陆成功标识,说用户刚才登录过, 就可以正常访问
    没有登录成功标识, 说明未登录, 只能去登录页 先进行登陆 

4- 代码实现

  1- 服务器默认没有开session功能,如果想让服务器使用session 区分用户,需要告诉服务器开启session  
    使用 express-session  来帮我们操作session 
    app.use(session({
      secret: 'itcast',  // 加密字符串  123  * 200 = 24600; 
      name: 'itcast-id'
    }));

  2- 在用户登录成功时, 给用户添加成功的标记  
  req.session.isLogin = true;

  3- 用户找服务器要页面是, 先判断用户号是否登录过,如果登录过就放行,否则去登陆 
  app.use((req, res, next) => {
    if (req.session.isLogin || req.url == '/login') {
      next(); 
    } else {
      res.redirect('/login');
    }
  })

  登录成功时, 在session中 添加 isLogin 标记 
  请求拦截时, 判断 session中是否有 isLogin 标记  
  退出是: 销毁session中 isLogin 标记 

express-session使用

  1. 下载 npm i express-session
  2. 导入 const session = require("express-session")
  3. 使用session中间件
app.use(session({
     // 给cookie中存储的sessionid加密的, 可以随意指定一个字符串
 	secret: 'itcast',
    // 设置浏览器端cookie中的sessionId设置名字, 默认connect.sid
    name: 'sessionId',
    resave: false,
    // 在浏览器和服务器连接的第一时间,分配session  给浏览器指定一个cookie
    saveUninitialized: true
 }))

​ 可以通过req.session访问到session

​ 4. 登录成功,把登录成功的用户信息存储到 req.session.xxx中

 db.findUser(username, password, result => {
    if (result.length > 0) {
      // 登录成功
      // 登录成功了,把当前用户的信息,保存到req.session中
      req.session.user = req.body
      res.redirect('/')
    } else {
      res.redirect('/login')
    }
  })

​ 5. 提供一个中间件,这个中间件在路由的前面,判断 req.session.xxx是否有值,有值,放走,没值,去登录,细节: 如果是/login 直接放走

app.use((req, res, next) => {    
    if ( !req.session.user && req.url !== '/login' ) {
        res.redirect('/login');        
    } else {
        next();
    }
});

​ 6. 退出功能: 把req.session.xxx 清空即可

  // 把session中的用户信息清空
  req.session.user = null
  // 跳到登录页
  res.redirect('/login')