关于Node.js的Session

关于Node.js的Session

之前有使用过微软的ASP.NET/ASP,可以通过Global.asax(global.asa)文件的Session_Start和Session_End事件来侦听Session的创建和销毁动作。 但在PHP和Node.js里就没有这样的机制。

想了解一下,Node.js里是如何实现的。

还有,如果将Session通过Mongoose存储在MongoDB里(如下方代码所示),interval: 120000需要怎样理解?这里所说的120秒的过期时间是如何起算的?是闲置120秒(120秒内没有向服务器提交任何新的请求),还是说无论页面是否闲置,120秒后就一定过期?个人有疑虑,感觉Node.js的会话机制与ASP.NET有所不同。尤其是将会话存储在MongoDB或是Redis这样的NoSQL数据库时,系统应该很难感知到用户会话会因闲置过久而超时过期。

还有,存储在MongoDB里的Session如何在MongoDB里进行查询?

var connect = require(‘connect’); var SessionStore = require(“session-mongoose”)(connect); var store = new SessionStore({ url: “mongodb://localhost/session”, interval: 120000 });

个人是新手,对Node.js了解的实在太少,也不知我的问题有没有描述清楚,还望各位能不吝赐教。 多谢!!!


8 回复

关于Node.js的Session

在Node.js中,处理Session的方式与传统的ASP.NET或PHP有所不同。ASP.NET通过Global.asax文件中的Session_StartSession_End事件来管理Session的创建和销毁,但Node.js并没有这种内置机制。不过,Node.js提供了灵活的方式来实现类似的功能。

Node.js中的Session管理

在Node.js中,通常使用中间件(如express-session)来管理Session。这些中间件可以将Session数据存储在内存、数据库(如MongoDB或Redis)或其他持久化存储中。

示例代码

以下是一个简单的示例,展示如何使用express-session中间件将Session数据存储在MongoDB中:

const express = require('express');
const session = require('express-session');
const MongoDBStore = require('connect-mongodb-session')(session);

const app = express();

// 创建MongoDB存储实例
const store = new MongoDBStore({
  uri: 'mongodb://localhost:27017/mydatabase',
  collection: 'mySessions'
});

// 设置session中间件
app.use(session({
  secret: 'your_secret_key',
  cookie: { maxAge: 120000 }, // 120秒后过期
  store: store,
  resave: false,
  saveUninitialized: false
}));

app.get('/', (req, res) => {
  if (req.session.views) {
    req.session.views++;
    res.setHeader('Content-Type', 'text/html');
    res.write(`<p>Views: ${req.session.views}</p>`);
    res.end();
  } else {
    req.session.views = 1;
    res.end('Welcome to the session demo. Refresh!');
  }
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

解释

  1. Session Store: 使用connect-mongodb-session中间件将Session数据存储在MongoDB中。uri指定MongoDB的连接字符串,collection指定存储Session数据的集合名称。

  2. Session 中间件配置:

    • secret: 用于加密Session ID的密钥。
    • cookie.maxAge: 指定Session的有效期。在这个例子中,设置为120000毫秒(即120秒)。
    • store: 指定Session数据存储的位置。
    • resave: 如果为false,则不会保存未修改的Session。
    • saveUninitialized: 如果为false,则不会保存未初始化的Session。
  3. Session 生命周期:

    • 当用户首次访问网站时,req.session.views被初始化为1。
    • 每次刷新页面时,views计数器递增。
    • 如果用户120秒内没有访问网站,则Session将自动失效。

Session 过期时间

maxAge设置为120000毫秒(即120秒),这意味着Session将在用户最后一次访问网站后的120秒内保持有效。如果在这段时间内用户没有再次访问网站,则Session将被视为过期。

查询MongoDB中的Session

如果你想查询MongoDB中的Session数据,可以使用MongoDB的查询API。例如,查询所有Session数据:

const MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://localhost:27017/mydatabase', (err, client) => {
  if (err) throw err;
  const db = client.db('mydatabase');
  const collection = db.collection('mySessions');

  collection.find().toArray((err, docs) => {
    if (err) throw err;
    console.log(docs);
    client.close();
  });
});

以上就是关于Node.js中Session的基本介绍和示例代码。希望这能帮助你更好地理解和使用Node.js中的Session机制。


没有人能解释一下吗?

《Nodejs开发指南》中的Microblog示例项目中有简单使用Session以及使用Mongodb存储Session的内容,可以网上找一找开源的Microblog学习项目看看,比如:https://github.com/tonyzhan/microblog

找到几个参考网址(以备后续参考): 一个mongodb存储session的模块 https://www.npmjs.org/package/connect-mongo http://www.senchalabs.org/connect/session.html https://www.npmjs.org/package/express-session-mongo http://docs.mongodb.org/manual/tutorial/expire-data/

另外,不使用session-mongoose也能将session存储在MongoDB里,而且还可以设定会话过期时间: 参考网址: Session lifetime in node.js with express and MongoDB

再提供一个网址顺便了解一下Nodejs基础中间件Connect,这里也有提及Session的使用: http://blog.fens.me/nodejs-connect/

根据我的理解,120 * 2 秒后就一定过期,但时间不确定。

尤其是将会话存储在MongoDB或是Redis这样的NoSQL数据库时,系统应该很难感知到用户会话会因闲置过久而超时过期。

系统是有感知的。

QQ20140909-2.png

session-mongoose 这个库会开个 workder 去定时检测。

可以用MONGODB - TTL 索引 创建一个过期会话 db.foo.ensureIndex({lastTime:1}, {expireAfterSecs:60*60})

对于活跃用户,每一次访问更新该字段的最新值。

当然首先,你需要一个md5或者sha1来加密存储用户session id

学习了!!!

在Node.js中,Session的管理与ASP.NET有所不同。通常情况下,Node.js使用中间件(如express-session)来处理Session,而不是像ASP.NET那样通过Global.asax文件中的事件。

关于Session的创建和销毁

在Node.js中,Session的创建和销毁通常是由中间件自动处理的。例如,使用express-session中间件:

const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);

const app = express();

app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: true,
    store: new MongoStore({ url: 'mongodb://localhost/session' })
}));

app.get('/', (req, res) => {
    req.session.views = (req.session.views || 0) + 1;
    res.send(`You have viewed this page ${req.session.views} times.`);
});

app.listen(3000, () => console.log('Server running on port 3000'));

interval: 120000的理解

interval: 120000是指每隔120000毫秒(即120秒)刷新一次Session数据,以确保Session不会因为长时间不活动而被MongoDB自动删除。这是为了防止Session过期,即使用户在120秒内没有提交任何请求。

  • 闲置120秒:实际上,这里的120秒并不是指用户是否处于闲置状态,而是指每隔120秒刷新一次Session数据,确保其不会过期。

  • 固定过期时间:如果你希望设置一个固定的过期时间,可以在Session配置中设置cookie.maxAge属性,例如:

    app.use(session({
        secret: 'your_secret_key',
        cookie: { maxAge: 120000 }, // 120秒后Session过期
        resave: false,
        saveUninitialized: true,
        store: new MongoStore({ url: 'mongodb://localhost/session' })
    }));
    

如何在MongoDB中查询Session

如果你想查询存储在MongoDB中的Session数据,可以使用MongoDB的查询API。例如,假设你已经连接到MongoDB,并且你的Session数据保存在一个名为sessions的集合中:

const MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://localhost/session', (err, client) => {
    if (err) throw err;
    const db = client.db();
    db.collection('sessions').find().toArray((err, sessions) => {
        if (err) throw err;
        console.log(sessions);
        client.close();
    });
});

以上代码展示了如何连接到MongoDB并查询所有Session数据。

希望这些信息对你有所帮助!

回到顶部