express手工实现session原理
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原理的更多相关文章
- Session原理、安全以及最基本的Express和Redis实现
Session原理.安全以及最基本的Express和Redis实现 https://segmentfault.com/a/1190000002630691
- session原理及实现共享
一.session的本质http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你.那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮箱 ...
- express 框架之session
一.什么是session? 最近在学习node.js 的express框架,接触到了关于session方面的内容.翻阅了一些的博客,学到了不少东西,发现一篇博文讲的很好,概念内容摘抄如下: Sessi ...
- session原理及实现集群session的方案原理
对Web服务器进行集群,Session的安全和同步是最大的问题,实现Session同步有很多种方案,常见的可能的方式有: 1.客户端Cookie加密. 用的较少,此处不详述. 2.Session ...
- express学习点滴- session()和cookieSession()的区别
express 里提供了两种有关session的中间件 * session() 提供了内存和数据库两种方式保存session.具体两种session原理请自行学习,不进行展开了.自己也是一知半解... ...
- session原理总结
session原理总结 session多服务器共享的方案梳理 session原理 session的工作原理 客户端禁用cookie时session解决方案[转]
- [转]PHP Session原理分析及使用
之前在一个叫魔法实验室的博客中看过一篇<php session原理彻底分析>的文章,作者从session的使用角度很好阐述了在代码运行过程中,每个环节的变化以及相关参数的设置及作用.本来想 ...
- express学习之session
最新版本的express没有包含session依赖项,需要我们自己配置并安装. 安装方法:npm install express-session 使用:var session = require('e ...
- 从session原理出发解决微信小程序的登陆问题
声明:本文为作者原创文章,转载请注明出处 https://www.cnblogs.com/MaMaNongNong/p/9127416.html 原理知识准备 对于已经熟悉了session原理的同 ...
随机推荐
- mongo设计(三)
原文:http://blog.mongodb.org/post/88473035333/6-rules-of-thumb-for-mongodb-schema-design-part-3 By Wil ...
- Ubuntu下Geary安装
sudo add-apt-repository ppa:yorba/ppasudo apt-get updatesudo apt-get install geary
- 500多条Linux信息
http://www.cnblogs.com/zgqjymx/myposts.html?page=77 http://www.cnblogs.com/zgqjymx/tag/%E5%8E%9F%E5% ...
- ping-tool
https://serve.netsh.org/pub/ping-tool/ https://serve.netsh.org/pub/ipv4-hosts/
- uva10934 Dropping water balloons
//好久没做题 一直没状态 然后刷了个水题玩玩 //寒假集训和校赛都做到了类似的题目 然而当时并不会 (其实现在也不会 题意:有k个气球和一个n层高的楼,气球有硬度,在某曾会恰好摔碎,问至少多少次实验 ...
- jquery 中 fn.apply(this, arguments)是什么函数?有什么作用?能举个例子吗
function Person(name){ this.name=name; this.sayname=function (){ alert(this.name); } } function Stud ...
- android 的线程模型和AsyncTask
android 的线程模型:当一个 android 的应用运行后,就会有一个 UI 的 main 线程启动 , 这是一个非常重要的线程,它负责把事件分派到相应的控件,其中就包括屏幕绘图 ...
- ASP.NET MVC 中将FormCollection与实体间转换方法【转】
将Action动作中传递的FormCollection转变成对应的实体,可以使用Controller的TryUpdateModel()方法. 示例如下: [HttpPost] public Actio ...
- 如何修改 UINavigationController、UINavigationBar 中 navigationItem 左侧 “返回” 按钮的名称
如果我们从 title 为 “首页” 的页面 A 点击进入一个子页面 B,那么在页面 B 的左上角将显示一个名为 “<首页” 的按钮.假设这个页面 A 叫 “你是我天边最美的云彩”,那在页面 B ...
- HDU1506_Largest Rectangle in a Histogram
Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...