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原理的同 ...
随机推荐
- python练习_购物车(2)
用python写了一个购物车程序,主要是练习,代码如下 主入口文件:main.py #!/usr/bin/env python # -*- coding:utf-8 -*- #先调用用户登录函数,在进 ...
- FastRPC 3.2 发布,高性能 C++ 协程 RPC 框架
用过go erlang gevent的亲们应该都会知道协程在应用中带来的方便. 如果对协程不理解的同学,通过阅读下面例子可以快速了解我们框架的协程的意义,已了解的可以跳过这部分. 协程例子:假设我们要 ...
- POJ 3662 Telephone Lines(二分答案+SPFA)
[题目链接] http://poj.org/problem?id=3662 [题目大意] 给出点,给出两点之间连线的长度,有k次免费连线, 要求从起点连到终点,所用的费用为免费连线外的最长的长度. 求 ...
- Objective-C编程调试技巧
为Objective-C编程调试技巧(译) http://www.cocoawithlove.com/2008/10/debugging-tips-for-objective-c.html 这篇文章是 ...
- python 生成器理解
通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素 ...
- iOS 性能测试 - FBMemoryProfiler
FBMemoryProfiler 是Facebook开源的一款用于分析iOS内存使用和检测循环引用的工具库. 脑补:http://www.cocoachina.com/ios/20160421/159 ...
- Curious Robin Hood(树状数组+线段树)
1112 - Curious Robin Hood PDF (English) Statistics Forum Time Limit: 1 second(s) Memory Limit: 64 ...
- Emoji字符检查与替换
当文本包含Emoji字符的时候,存储到数据库或读取的时候需要进行编码和解码(如UTF_8),否则MySQL的存储可能有异常. 当有的文本不允许输入Emoji字符,或者显示时需要将Emoji替换为指定字 ...
- JS 去除特定符号(逗号)的方法
<script language="javascript"> var str="asdfk,asdf345345,345345"; //替换除数字与 ...
- mysql 基本使用
SQL分类 -------------------数据库------------ 创建数据库 create database xxx; 查询所有的数据库 show databases; 查询当前数据 ...