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. jsonarray----->list

    JSONArray--------------->List----------------->Adapter------------------>ListView

  2. HCE:Host-based Card Emulation基于Android设备的卡片模拟器

    HCE技术支持提供了一个软实现SE的通路,Service实现的方式很多,可以使用文件,使用网络,甚至连接真正的SE.支持HCE的测试手机:目前可以确定使用了NXP PN547作为CLF的NFC手机已经 ...

  3. aix installp软件包管理工具

    软件可以安装成两种状态:applied和committed.Applied状态保存了原来以前版本的软件,它把以前版本存储在/usr/lpp/PackageName目录下.这种方式可以回滚到以前的软件版 ...

  4. 创业青年:刘霞(YBC推荐)_CCTV.com_中国中央电视台

    创业青年:刘霞(YBC推荐)_CCTV.com_中国中央电视台 创业青年:刘霞(YBC推荐) CCTV.com  2009年06月23日 09:57  进入复兴论坛  来源:央视网       姓名 ...

  5. #include <assert.h>

    assert宏 适用于软件测试.调试.排错 被除数不能为0,assert可以用于检测被除数是否为0 #define _CRT_SECURE_NO_WARNINGS //#define NDEBUG// ...

  6. Fibonacci Tree(最小生成树,最大生成树)

    Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. httpclient response 重定向

    HTTPClient请求后,重定向后,获取重定向的URL. 方法一:重定向后获取URL import org.apache.http.HttpEntity; import org.apache.htt ...

  8. bootstrap-js(2)下拉菜单

    1.下面的实例演示了在导航栏内和标签内的下拉菜单的用法: <!DOCTYPE HTML><html><head><link href="/style ...

  9. bootstrap注意事项(二)

    1.内联子标题 在标题内还可以包含 <small> 标签或赋予 .small 类的元素,可以用来标记副标题. <!DOCTYPE html> <html> < ...

  10. hadoop 各种组件配置参数

    ********************************************hive*********************************************** hive ...