var express = require('express');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser()) var sessions = { };
var key = ' session_id ';
var EXPIRES = 20 * 60 * 1000;
var generate = function(){
var session = {};
session.id = (new Date().getTime() + Math.random());
session.cookie = {
expire : new Date().getTime() + EXPIRES
}
sessions[session.id] = session;
return session;
} app.use("/",function(req, res,next){ var id = req.cookies.id;
if(!id){
console.log("无ID");
req.session = generate();
console.log(req.session);
}else{
console.log("有ID");
var session = sessions[id];
if(session){
console.log("有session");
req.session = session;
}else{
req.session = generate();
}
}
res.setHeader('Set-Cookie',['id='+req.session.id,'aaa="bbbb"','path=/', 'max-age=360000','expires='+req.session.cookie.expire]);
next() });
app.get("/",function(req,res){
if(!req.session.isvist){
req.session.isvist = true;
res.send("第一次登陆")
}else{
console.log(sessions)
res.send("再次登陆")
}
}) app.listen(8080);

修正后:将app.use(“/”)改为app.use("*")

var express = require('express');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var app = express();
var user = require('./modules/user');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser()); console.log(user);
var sessions = { };
var key = ' session_id ';
var EXPIRES = 20 * 60 * 1000;
var generate = function(){
var session = {};
session.id = (new Date().getTime() + Math.random());
session.cookie = {
expire : new Date().getTime() + EXPIRES
}
sessions[session.id] = session;
return session;
} //通过中间件实现在每一个路由中都生成session
app.use("*",function(req, res,next){
req.aa = "aaaaa";
var id = req.cookies.id;
if(!id){
console.log("无ID");
req.session = generate();
console.log(req.session);
}else{
console.log("有ID");
var session = sessions[id];
if(session){
console.log("有session");
req.session = session;
}else{
req.session = generate();
}
}
res.setHeader('Set-Cookie',['id='+req.session.id,'aaa="bbbb"','path=/', 'max-age=360000','expires='+req.session.cookie.expire]);
next() });
app.get("/",function(req,res){
if(!req.session.isvist){
req.session.isvist = true;
res.send("第一次登陆")
}else{
console.log(sessions)
res.send("再次登陆")
}
})
app.get('/a',function(req,res){ }) app.listen(8080);

基本逻辑就是,用户进入路由先判断cookie中有没有ID;

没有Id的话生成一个新的session;

有ID的话根据ID去内存或数据库查找session

若没有session生成一个新的session;

若有session查看其过期时间,若过期生成新的session

若没有过期,更新其时间;

最后将session赋值给req.session;

这样在其他路由里就可以访问session了,并且req.session可以挂载任何属性,比方说用户登录后将用户信息挂载到req.session上

express手工实现session原理的更多相关文章

  1. Session原理、安全以及最基本的Express和Redis实现

    Session原理.安全以及最基本的Express和Redis实现 https://segmentfault.com/a/1190000002630691

  2. session原理及实现共享

    一.session的本质http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你.那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮箱 ...

  3. express 框架之session

    一.什么是session? 最近在学习node.js 的express框架,接触到了关于session方面的内容.翻阅了一些的博客,学到了不少东西,发现一篇博文讲的很好,概念内容摘抄如下: Sessi ...

  4. session原理及实现集群session的方案原理

    对Web服务器进行集群,Session的安全和同步是最大的问题,实现Session同步有很多种方案,常见的可能的方式有: 1.客户端Cookie加密.    用的较少,此处不详述. 2.Session ...

  5. express学习点滴- session()和cookieSession()的区别

    express 里提供了两种有关session的中间件 * session() 提供了内存和数据库两种方式保存session.具体两种session原理请自行学习,不进行展开了.自己也是一知半解... ...

  6. session原理总结

    session原理总结 session多服务器共享的方案梳理 session原理 session的工作原理 客户端禁用cookie时session解决方案[转]

  7. [转]PHP Session原理分析及使用

    之前在一个叫魔法实验室的博客中看过一篇<php session原理彻底分析>的文章,作者从session的使用角度很好阐述了在代码运行过程中,每个环节的变化以及相关参数的设置及作用.本来想 ...

  8. express学习之session

    最新版本的express没有包含session依赖项,需要我们自己配置并安装. 安装方法:npm install express-session 使用:var session = require('e ...

  9. 从session原理出发解决微信小程序的登陆问题

    声明:本文为作者原创文章,转载请注明出处 https://www.cnblogs.com/MaMaNongNong/p/9127416.html  原理知识准备  对于已经熟悉了session原理的同 ...

随机推荐

  1. python排序(冒泡, 快速)

    之前用java时学习的一些基础算法,今天在python上也研究下. 1. 冒泡排序 算法步骤: 50   30   70  90 10 1)50 跟 30 比不用交换. 2)步数+1, 30 跟70比 ...

  2. Delphi2007下CIS的clHttp使用

    Delphi组件Clever Suite Internet是一款优秀的网络组件,唯一让我感觉不足的是ClHttp竟然使用了断言,当程序遇到问题的时候就会弹出一个对话框,并显示问题是出在了那个单元里.好 ...

  3. mysql排行榜sql的实现

    SELECT num_rows AS num_rows, openid , openid, money FROM lt_cash_user ) t ORDER BY money DESC ) t1 W ...

  4. 栈和队列的Java实现

    一.  栈 1.概念 栈是一种特殊的线性表,它只能在栈顶(top)进行插入(push)和删除(pop)操作. 栈的常用操作: 入栈(push):向栈顶插入元素 出栈(pop):从栈顶删除元素 访问栈顶 ...

  5. 优步北京B组(8月10日-8月16日奖励规则)

    奖励政策: [优步北京B组] 定义为2015年7月20日前激活的部分司机(以优步后台数据显示为准) 滴滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机( ...

  6. MFC CWnd仿按钮

    CBtn::CBtn() { RegisterWndClass(); } bool CBtn::RegisterWndClass(void) { WNDCLASS n; HINSTANCE hInst ...

  7. LinqToSQL实例参见

    /// <summary> /// (增)向表中插入数据 /// </summary> public void InsertData() { LinqToSQLDataCont ...

  8. windows编程之菜单操作

    分清几个概念 <1>"主菜单" 和 "顶层菜单" 是一个意思. <2>主菜单中的项目叫做 "弹出菜单" 或者 &qu ...

  9. Ibatis代码自动生成工具——Abator安装与应用实例(图解)

    Abator 能自动生成DAO,DTO和sqlMap,大大提高开发效率.Abator 的官方网站:http://ibatis.apache.org/ibator.html 使用也比较简单,以下做个实例 ...

  10. React系列(一):React入门

    React简介 1.由来 React是有Facebook开发出来用于构建前端界面的JS组件库,由于其背后的强大背景,使得这款库在技术开发上完全没有问题. 2.React的优势 解决大规模项目开发中数据 ...