zoukankan      html  css  js  c++  java
  • express-session中的saveUninitialized和resave

    app.use(session({
        name: config.session.name,
        secret: config.session.secret,
        resave: true,
        saveUninitialized: false,
        cookie: config.session.cookie,
        store: new MongoStore({
            url: config.url
        })
    }))
    

    express-session是一个中间件,接收一写参数,返回一个函数:

    return function session(req, res, next) {}
    

    首先当请求到达服务端的时候,解析request,拿到cookie中的sessionId,保存到req上供后面使用

    var cookieId = req.sessionID = getcookie(req, name, secrets);
    

    如果请求的cookie中没有sessionID,会由一个generate方法创建一个session对象,同时在request对象上添加了sessionID,session

    store.generate = function (req) {
        req.sessionID = generateId(req);
        req.session = new Session(req);
        req.session.cookie = new Cookie(cookieOptions);
    
        if (cookieOptions.secure === 'auto') {
            req.session.cookie.secure = issecure(req, trustProxy);
        }
    };
    

    只要修改了session比如req.session.view++,express-session通过重写了response.end,在返回数据的时候进行一次保存:

    var _end = res.end;
    res.end = function end(chunk, encoding) {
      ....
    	return _end.call(res, chunk, encoding);
    }
    

    那么如果没有修改session,是否保存到数据库或者内存中,由函数shouldSave来处理:

    function shouldSave(req) {
        // cannot set cookie without a session ID
        if (typeof req.sessionID !== 'string') {
            debug('session ignored because of bogus req.sessionID %o', req.sessionID);
            return false;
        }
    
        return !saveUninitializedSession && cookieId !== req.sessionID
          ? isModified(req.session)
          : !isSaved(req.session)
    }
    function isSaved(sess) {
        return originalId === sess.id && savedHash === hash(sess);
    }
    function isModified(sess) {
        return originalId !== sess.id || originalHash !== hash(sess);
    }
    

    其中涉及到saveUninitialized和resave的配置,

    saveUninitialized : 是否强制将未初始化的 session 存储。当新建了一个 session 且未设定属性或值时,它就处于未初始化状态。

    resave:是指每次请求都重新设置session cookie,最直观的表现就是客户端的cookie的有效期在变化;

    下面是整理的不同配置下在是否有sessionId的cookie的情况下的处理结果表格:

    saveUninitialized resave 是否向服务端传递了sessionId的cookie 对应的处理
    true true/false 1.由isSaved来决定结果,而此时 isSaved为false shouldSave为true
    2.执行保存session的操作
    true true/false 1.由isSaved来决定结果,而此时isSaved为true, shouldSave为false
    2.不执行保存session的操作
    false true/false 1.cookieId为undefined 和req.sessionID不相等
    2.由isModified来决定结果,而此时isModified为false shouldSave为false
    3.这种情况说的就是如果session未初始化不存储起来,可以减轻服务端的压力
    false false 1.cookieId 与 req.sessionID一致
    2.有isSaved来决定,此时isSaved()为true,shouldSave为false
    3.不执行保存session的操作
    false true 1.cookieId 与 req.sessionID一致
    2.有isSaved来决定,此时isSaved()为false,shouldSave为true
    3.执行保存session的操作

    demo地址:
    https://github.com/blank-x/node-daily/tree/master/express-session_

  • 相关阅读:
    Linux关闭防火墙和selinux
    Linux内存VSS,RSS,PSS,USS解析
    JS 将有父子关系的数组转换成树形结构数据
    npm install报错类似于npm WARN tar ENOENT: no such file or directory, open '*** ode_modules.staging***
    react-native之文件上传下载
    Markdown语法简记
    MySQL运维开发
    股票投资
    数据仓库原理与实战
    python基础
  • 原文地址:https://www.cnblogs.com/walkermag/p/13584960.html
Copyright © 2011-2022 走看看