zoukankan      html  css  js  c++  java
  • node中session存储与销毁,及session的生命周期

    1、首先在使用session之前需要先配置session的过期时间等,在入口文件app.js中

     app.use(express.session({
    cookie: {
    maxAge: config.get("secret.maxAge") //这里就是设置了session的过期时间,配置文件中是120000,即20分钟。
    },
    secret: config.get("secret.sessionSecret"),
    store: new RedisStore({
    host: config.get("session_server").ip,
    port: config.get("session_server").port,
    prefix: config.get("session_server").prefix
    //,db:'mydb' //此属性可选。redis可以进行分库操作。若无此参数,则不进行分库
    })
    }));
    }

    2、在现在做的系统中,登陆请求成功之后,服务器存储了一个session,代码

    req.session.username = user.userName;//存储的是一个用户名


    3、用户登陆之后的操作在路由的拦截器里面校验session,校验成功之后为此session增加20分钟的过期时间。
    exports.checkTBLogin = function(req, cb) {
    if(req.session && req.session.loginTB){
    console.log("req.session.---------------"+req.session.loginTB);
    console.log(' req.session.cookie.expires============'+ req.session.cookie.expires);
    req.session.cookie.expires= new Date(Date.now() + 20 * 60 * 1000);
    return cb(null);
    }else{
    return cb(null, "login");
    }
    return cb(null, "login");
    };

    4、用户点击退出的额时候,销毁session

    req.session.destroy();
    5、考虑到网站安全的问题,用户做任何操作的时候都要验证session。session的生命周期决定这种方式也不是绝对安全的,
    假如用户已经登录了,攻击者截取到了用户发送到服务器的请求,用请求里的sessionid,去做其他操作,只要被截取的用户在线,服务器上这个session没有过期,那操作都能成功。
    6、session的生命周期
    当一个Session开始时,Servlet容器会创建一个HttpSession对象,那么在HttpSession对象中,可以存放用户状态的信息。
    Servlet容器为HttpSession对象分配一个唯一标识符即Sessionid,Servlet容器把Sessionid作为一种Cookie保存在客户端的 *浏览器* 中。

        用户每次发出Http请求时,Servlet容器会从HttpServletRequest对象中取出Sessionid,然后根据这个Sessionid找到相应的HttpSession对象,从而获取用户的状态信息。

    我们知道Session是存在于服务器端的,当把浏览器关闭时,浏览器并没有向服务器发送

    任何请求来关闭Session,自然Session也不会被销毁,但是可以做一点努力,在所有的

    客户端页面里使用js的window.onclose来监视浏览器的关闭动作,然后向服务器发送一

    个请求来关闭Session,但是这种做法在实际的开发中也是不推荐使用的,最正常的办法

    就是不去管它,让它等到默认的时间后,自动销毁。

    那么为什么当我们关闭浏览器后,就再也访问不到之前的session了呢?

    其实之前的Session一直都在服务器端,而当我们关闭浏览器时,此时的Cookie是存在

    于浏览器的进程中的,当浏览器关闭时,Cookie也就不存在了。

    其实Cookie有两种:

    • 一种是存在于浏览器的进程中;
    • 一种是存在于硬盘上

    而session的Cookie是存在于浏览器的进程中,那么这种Cookie我们称为会话Cookie,

    当我们重新打开浏览器窗口时,之前的Cookie中存放的Sessionid已经不存在了,此时

    服务器从HttpServletRequest对象中没有检查到sessionid,服务器会再发送一个新的存

    有Sessionid的Cookie到客户端的浏览器中,此时对应的是一个新的会话,而服务器上

    原先的session等到它的默认时间到之后,便会自动销毁。

    当在同一个浏览器中同时打开多个标签,发送同一个请求或不同的请求,仍是同一个session;

    当不在同一个窗口中打开相同的浏览器时,发送请求,仍是同一个session;

    当使用不同的浏览器时,发送请求,即使发送相同的请求,是不同的session;

    当把当前某个浏览器的窗口全关闭,再打开,发起相同的请求时,就是本文所阐述的,是不同的session,但是它和session的生命周期是没有关系的.



  • 相关阅读:
    Parameter Binding in ASP.NET Web API
    Which HTTP methods match up to which CRUD methods?
    ErrorHandling in asp.net web api
    HttpStatusCode
    Autofac Getting Started(默认的构造函数注入)
    Autofac Controlling Scope and Lifetime
    luvit 被忽视的lua 高性能框架(仿nodejs)
    undefined与null的区别
    VsCode中使用Emmet神器快速编写HTML代码
    字符串匹配---KMP算法
  • 原文地址:https://www.cnblogs.com/learnings/p/8514106.html
Copyright © 2011-2022 走看看