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的生命周期是没有关系的.

												

node中session存储与销毁,及session的生命周期的更多相关文章

  1. 【学习笔记】Spring中的BeanFactory和ApplicationContext 以及 Bean的生命周期(Y2-3-2)

    BeanFactory和ApplicationContext Spring的IoC容器就是一个实现了BeanFactory接口的可实例化类. Spring提供了两种不同的容器: 一种是最基本的Bean ...

  2. Unity3d中MonoBehavior默认函数的执行顺序和生命周期

    Awake()在MonoBehavior创建后就立刻调用,在脚本实例的整个生命周期中,Awake函数仅执行一次:如果游戏对象(即gameObject)的初始状态为关闭状态,那么运行程序,Awake函数 ...

  3. java之hibernate之session中对象的生命周期

    1. session是用来执行对象的crud操作,并且session是对象事务工厂.session是线程级别的,所以生命周期比较短. 2.session中对象的生命周期图: 3.session中对象的 ...

  4. Session原理、生命周期及购物车功能的实现

    在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据(保存该浏览器(会话)的相关信息)时 ...

  5. vue生命周期图示中英文版Vue实例生命周期钩子

    vue生命周期图示中英文版Vue实例生命周期钩子知乎上近日有人发起了一个 “react 是不是比 vue 牛皮,为什么?” 的问题,Vue.js 作者尤雨溪12月4日正面回应了该问题.以下是尤雨溪回复 ...

  6. 12、生命周期-@Bean指定初始化和销毁方法

    12.生命周期-@Bean指定初始化和销毁方法 Bean的生命周期:创建->初始化->销毁 容器管理bean的生命周期 我们可以自定义初始方法和销毁方法,容器在bean进行到当期那生命周期 ...

  7. Flutter--Flutter中Widget、App的生命周期

    前言 在App的开发过程中,我们通常都需要了解App以及各个页面的生命周期,方便我们在App进入前台时启动一些任务,在进入后台后暂停一些任务.同时,各个页面的生命周期也很重要,每个页面消失时要做一些内 ...

  8. 一个BPMN流程示例带你认识项目中流程的生命周期

    摘要:本文详细说明了在工作流Activiti框架中的BPMN流程定义整个运行的生命周期. 本文分享自华为云社区<本文详细说明了在工作流Activiti框架中的BPMN流程定义整个运行的生命周期& ...

  9. 面试突击80:说一下 Spring 中 Bean 的生命周期?

    Java 中的公共类称之为 Bean 或 Java Bean,而 Spring 中的 Bean 指的是将对象的生命周期,交个 Spring IoC 容器来管理的对象.所以 Spring 中的 Bean ...

随机推荐

  1. thinkphp 视频教程

    http://edu.51cto.com/lesson/id-28238.html thinkphp

  2. 利用JNDI的命名与服务功能来满足企业级API对命名与服务的访问

    包含了大量的命名和目录服务,使用通用接口来访问不同种类的服务: 可以同时连接到多个命名或目录服务上: 建立起逻辑关联,允许把名称同Java对象或资源关联起来,而不必知道对象或资源的物理ID. JNDI ...

  3. SourceInsight 不断无响应的有关问题

    SourceInsight 不断无响应的问题 sourceinsight3使用过程中,如果是大工程,总是出现抽筋的现象,CPU使用.内存占用都很高,阅读android源码不断出现无响应.后发现主要是因 ...

  4. servlet部署到tomcat中

    引用:http://blog.csdn.net/shuidao/article/details/1738059 配置,部署 servlet: 1. 在tomcat的安装目录下 找到webapps 文件 ...

  5. ios - 上下滚动的新闻

    #import <UIKit/UIKit.h> @interface ScrollUpDownView : UIView //设置 要现实的文字 @property(nonatomic, ...

  6. NewtonSoft.Json NULL转空字符串

    from:http://www.cnblogs.com/hetuan/articles/4565702.html NewtonSoft.Json对需要转为JSON字符串的对象的NULL值以及DBNul ...

  7. 字符设备驱动程序--LED驱动

    编写驱动程序需要编写那些代码: 1.硬件相关的驱动程序 2.Makefile的编译程序 3.还需要编写一个相关的测试程序 比如说:一个摄像头驱动程序 1.驱动程序的编写,需要编写一些硬件相关的操作,编 ...

  8. UIAlertView及UIActionSheet 在ios8极其以下版本的兼容问题解决方案

    本文转载至 http://www.aichengxu.com/view/35326 UIAlertView及UIActionSheet在ios8中被放弃,其功能将完全由UIAlertControlle ...

  9. 学习boost::asio一些小例子

    # #include <boost/asio.hpp> #include <boost/thread.hpp> #include <iostream> void h ...

  10. (int)()和int()强制类型转换

    (int)()这个是c语言的强制转换,众所知周 int(),这种理解靠谱点 Class A { A(int i){} } 调用int类型的构造函数然后转换的 其实都可以转换.