|
2#
楼主 |
发表于 2018-3-5 09:35:35
|
只看该作者
二、express框架之session 内存存储
express-session 是基于express框专门用于处理session的中间件。这里不谈express-session怎
么安装,只给出相应的实例代码。另外,session的认证机制离不开cookie,需要同时使用cookiePa
rser 中间件,
- var express = require('express');
- 2 var session = require('express-session');
- 3 var cookieParser = require('cookie-parser');
- 4
- 5 var app = express();
- 6
- 7 app.use(cookieParser());
- 8 app.use(session({
- 9 secret: '12345',
- 10 name: 'testapp', //这里的name值得是cookie的name,默认cookie的name是:connect.sid
- 11 cookie: {maxAge: 80000 }, //设置maxAge是80000ms,即80s后session和相应的cookie失效过期
- 12 resave: false,
- 13 saveUninitialized: true,
- 14 }));
- 15
- 16
- 17 app.get('/awesome', function(req, res){
- 18
- 19 if(req.session.lastPage) {
- 20 console.log('Last page was: ' + req.session.lastPage + ".");
- 21 }
- 22 req.session.lastPage = '/awesome'; //每一次访问时,session对象的lastPage会自动的保存或更新内存中的session中去。
- 23 res.send("You're Awesome. And the session expired time is: " + req.session.cookie.maxAge);
- 24 });
- 25
- 26 app.get('/radical', function(req, res){
- 27 if (req.session.lastPage) {
- 28 console.log('Last page was: ' + req.session.lastPage + ".");
- 29 }
- 30 req.session.lastPage = '/radical';
- 31 res.send('What a radical visit! And the session expired time is: ' + req.session.cookie.maxAge);
- 32 });
- 33
- 34 app.get('/tubular', function(req, res){
- 35 if (req.session.lastPage){
- 36 console.log("Last page was: " + req.session.lastPage + ".");
- 37 }
- 38
- 39 req.session.lastPage = '/tubular';
- 40 res.send('Are you a suffer? And the session expired time is: ' + req.session.cookie.maxAge);
- 41 });
- 42
- 43
- 44 app.listen(5000);
复制代码 2.1 express-session中间件的使用:
只需要用express app的use方法将session挂载在‘/’路径即可,这样所有的路由都可以访问到sess
ion。可以给要挂载的session传递不同的option参数,来控制session的不同特性。具体可以参见官网
:https://github.com/expressjs/session/blob/master/README.md。
2.2 session内容的存储和更改:
To store or access session data, simply use the request property req.session, which is (generally) seri
alized as JSON by the store, so nested objects are typically fine.
一旦我们将express-session中间件用use挂载后,我们可以很方便的通过req参数来存储和访问se
ssion对象的数据。req.session是一个JSON格式的JavaScript对象,我们可以在使用的过程中随意的增
加成员,这些成员会自动的被保存到option参数指定的地方,默认即为内存中去。
2.3 session的生命周期
session与发送到客户端浏览器的生命周期是一致的。而我们在挂载session的时候,通过option选
项的cookie.maxAge成员,我们可以设置session的过期时间,以ms为单位(但是,如果session存储在
mongodb中的话,任何低于60s(60000ms)的设置是没有用的,下文会有详细的解释)。如果maxAg
e不设置,默认为null,这样的expire的时间就是浏览器的关闭时间,即每次关闭浏览器的时候,sessio
n都会失效。
三、express框架之session 数据库存储
有时候,我们需要session的声明周期要长一点,比如好多网站有个免密码两周内自动登录的功
能。基于这个需求,session必须寻找内存之外的存储载体,数据库能提供完美的解决方案。这里,
我选用的是mongodb数据库,作为一个NoSQL数据库,它的基础数据对象时database-collection-do
cument 对象模型非常直观并易于理解,针对node.js 也提供了丰富的驱动和API。express框架提供
了针对mongodb的中间件:connect-mongo,我们只需在挂载session的时候在options中传入mong
odb的参数即可,程序运行的时候, express app 会自动的替我们管理session的存储,更新和删除。
- var express = require('express');
- 2 var session = require('express-session');
- 3 var cookieParser = require('cookie-parser');
- 4 var MongoStore = require('connect-mongo')(session);
- 5 var app = express();
- 6
- 7 app.use(cookieParser());
- 8 app.use(session({
- 9 secret: '12345',
- 10 name: 'testapp',
- 11 cookie: {maxAge: 80000 },
- 12 resave: false,
- 13 saveUninitialized: true,
- 14 store: new MongoStore({ //创建新的mongodb数据库
- 15 host: 'localhost', //数据库的地址,本机的话就是127.0.0.1,也可以是网络主机
- 16 port: 27017, //数据库的端口号
- 17 db: 'test-app' //数据库的名称。
- 18 })
- 19 }));
- 20
- 21
- 22 app.get('/awesome', function(req, res){
- 23
- 24 if(req.session.lastPage) {
- 25 console.log('Last page was: ' + req.session.lastPage + ".");
- 26 }
- 27 req.session.lastPage = '/awesome';
- 28 res.send("You're Awesome. And the session expired time is: " + req.session.cookie.maxAge);
- 29 });
- 30
- 31 app.get('/radical', function(req, res){
- 32 if (req.session.lastPage) {
- 33 console.log('Last page was: ' + req.session.lastPage + ".");
- 34 }
- 35 req.session.lastPage = '/radical';
- 36 res.send('What a radical visit! And the session expired time is: ' + req.session.cookie.maxAge);
- 37 });
- 38
- 39 app.get('/tubular', function(req, res){
- 40 if (req.session.lastPage){
- 41 console.log("Last page was: " + req.session.lastPage + ".");
- 42 }
- 43
- 44 req.session.lastPage = '/tubular';
- 45 res.send('Are you a suffer? And the session expired time is: ' + req.session.cookie.maxAge);
- 46 });
- 47
- 48
- 49 app.listen(5000);
- 复制代码
复制代码 跟session的内存存储一样,只需增加红色部分的store选项即可,app会自动替我们把session存入到mo
ngodb数据,而非内存中。
3.1 session的生命周期:
由于session是存在服务器端数据库的,所以的它的生命周期可以持久化,而不仅限于浏览器关闭
的时间。具体是由cookie.maxAge 决定:如果maxAge设定是1个小时,那么从这个因浏览器访问服务
器导致session创建开始后,session会一直保存在服务器端,即使浏览器关闭,session也会继续存在。
如果此时服务器宕机,只要开机后数据库没发生不可逆转的破坏,maxAge时间没过期,那么session
是可以继续保持的。
当maxAge时间过期后,session会自动的数据库中移除,对应的还有浏览器的cookie。不过,由于
connect-mongo的特殊机制(每1分钟检查一次过期session),session的移除可能在时间上会有一定
的滞后。
- 复制代码
- connect-mongo uses MongoDB's TTL collection feature (2.2+) to have mongod automatically remove expired sessions. (mongod runs this check every minute.)
- Note: By connect/express's default, session cookies are set to expire when the user closes their browser (maxAge: null). In accordance with standard industry practices, connect-mongo will set these sessions to expire two weeks from their last 'set'. You can override this behavior by manually setting the maxAge for your cookies -- just keep in mind that any value less than 60 seconds is pointless, as mongod will only delete expired documents in a TTL collection every minute.
复制代码 当然,由于cookie是由浏览器厂商实现的,cookie不具有跨浏览器的特性,例如,我用firefox浏览器在
京东上购物时,勾选了2周内免密码输入,但是当我第一次用IE登陆京东时,同样要重新输入密码。所
以,这对服务器的同一个操作,不同的浏览器发起的请求,会产生不同的session-cookie。
|
|