1. cookie 是保存在客户端的,虽然为服务器减少了很多压力,但某些情况下,会出现麻烦,比如,验证码:

  2. 如果这样做,客户端可以随便填写一个别人的手机号,然后从 cookie 中获取到验证码,从而绕开整个验证;

  3. 因此,有些敏感数据是万万不能发送给客户端的,那要如何实现这一流程呢?

  4. 可见 session 也是键值对,它保存在服务器端,通过 sessionid 和客户端关联;

session 是什么?

  1. session 本质是一段保存在服务端内存中的代码片段,session 的实现一般是基于 cookie 的;

  2. cookie 记录凭证,session 记录具体数据;和 cookie 相比,比较安全,session 是存储在服务端的;

session 存在问题

  1. session 会占用内存,开销大,传统的 session 保存在内存里,每当用户登录时,在 session 做一次记录,随着认证用户的增多,服务端的开销会明显增大;

  2. session 横向扩展差,页面的请求不一定是同一台服务器,如果请求打到不同服务器,那么服务器之间需要共享 session ,此时需要做 session 的持久化,如果持久化失败就出现认证失败;

session 实现

  1. 在服务器端生成全局唯一标识符 session_id ,在服务器内存里开辟此 session_id 对应的数据存储空间,将 session_id 作为全局唯一标示符通过 cookie 发送给客户端;

  2. 以后客户端再次访问服务器时会把 session_id 通过请求头中的 cookie 发送给服务器;

  3. 服务器再通过 session_id 把此标识符在服务器端的数据取出;

var express = require('express');
var cookieParser = require('cookie-parser');
var app = express();
app.use(cookieParser());

//存放会话数据 key卡号 value就是卡号对应的数据对象
var sessions = {};
//与客户端约定的会话ID
var SESSION_KEY = 'connect.sid'

//当用户访问根目录的时候 执行对应的回调函数
app.get('/', function (req, res) {
    res.setHeader('Content-Type', 'text/html;charset=utf-8');

    // 1. 先取出cookie中的sessionId 卡号
    var sessionId = req.cookies[SESSION_KEY];
    // 如果有卡号的,也就是有ID的话 老顾客
    if (sessionId) {
        //取出此卡号对应的信息,余额
        var sessionObj = sessions[sessionId];
        if (sessionObj) {
            //扣掉10块钱
            sessionObj.balance = sessionObj.balance - 10;
            res.send('欢迎你老顾客,你卡上还剩' + sessionObj.balance);
        } else {
            genId(res);
        }
        //如果没有的话就是新顾客
    } else {
        genId(res);
    }

    function genId(res) {
        //由店家生成一个唯一的卡号
        var id = Date.now() + '' + Math.random();
        //要在店家的小本上记录一下此卡号对应的余额
        sessions[id] = { balance: 100 };
        //把这个卡发给顾客带回家
        res.cookie(SESSION_KEY, id);
        //告诉 用户送他一张卡
        res.send('欢迎你新顾客,送你一张价值100元的剪发卡');
    }
});
app.listen(9090);

面试题

参考答案:

  1. cookie 的数据保存在浏览器端;session 的数据保存在服务器;
  2. cookie 的存储空间有限;session 的存储空间不限;
  3. cookie 只能保存字符串;session 可以保存任何类型的数据;
  4. cookie 中的数据容易被获取;session 中的数据难以获取;

如何消除 session

参考答案:

  1. 过期时间:当客户端长时间没有传递 sessionid 过来时,服务器可以在过期时间之后自动清除 session
  2. 客户端主动通知:可以使用 JS 监听客户端页面关闭或其他退出操作,然后通知服务器清除 session
打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. cookie 的缺陷
  2. 2. session 是什么?
  3. 3. session 存在问题
  4. 4. session 实现
  5. 5. 面试题
    1. 5.1. cookie 和 session 的区别是什么?
    2. 5.2. 如何消除 session