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

												

最新文章

  1. 2016年第2周读书笔记与工作笔记 scrollIntoView()与datalist元素
  2. [Bug FIX]安装 account_check_writing模块后采购收据打印报错的问题
  3. mac 安装memcached服务
  4. C#读写文件总结
  5. VLLookUp 不同表单按条件赋值
  6. nginx上搭建HLS流媒体服务器
  7. extern “C”的作用
  8. 转:靠谱的代码和DRY
  9. Java程序测试之线程的使用
  10. 纯HTML课表
  11. Visual Studio Code 使用心得
  12. 解决Base64报错
  13. SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)
  14. larave异步多图片上传的实现和注意事项及$file的对象函数
  15. 关于jstl中碰到的Property 'username' not found on type java.lang.String异常
  16. DML_DDL_触发器
  17. 内置---排序(sorted)
  18. nginx_tcp模块集成到openresty(安装ngx_tcp_lua_module模块)
  19. python- do_excel
  20. 笔记 freemark list标签迭代Map<Map<String,Object>集合排序问题

热门文章

  1. 复制代码后调试程序,报错:在当前上下文中不存在名称“InitializeComponent”
  2. asp.net 定时间点执行任务的简易解决办法
  3. Uva1025 A Spy in the Metro
  4. P2424 约数和
  5. 【BZOJ1977】[BeiJing2010组队]次小生成树 Tree 最小生成树+倍增
  6. 【BZOJ4974】字符串大师 KMP
  7. CAFFE学习笔记(五)用caffe跑自己的jpg数据
  8. Frosh Week(归并排序求逆序数)
  9. 用javascript复制富文本
  10. Windows下比较小巧的c/c++ ide