Nodejs express4.9 express-session失效

Nodejs express4.9 express-session失效

有没有比较完整的实例啊?

7 回复

当然可以。在Express应用中使用express-session模块时,有时可能会遇到session失效的问题。这通常与配置不正确、中间件顺序错误或存储问题有关。以下是一个完整的示例,展示如何正确配置和使用express-session

示例代码

首先,确保你已经安装了必要的依赖项:

npm install express express-session

然后,在你的项目文件中,例如 app.jsserver.js,你可以这样配置和使用express-session

const express = require('express');
const session = require('express-session');

const app = express();

// 配置express-session
app.use(session({
    secret: 'your_secret_key', // 用于签名session ID cookie的密钥
    resave: false,             // 强制未初始化的会话保存到存储中
    saveUninitialized: true,   // 保存未初始化的会话
    cookie: {
        maxAge: 60 * 1000 * 30   // 设置session过期时间(30分钟)
    }
}));

// 示例路由
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!');
    }
});

// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

解释

  1. 配置 express-session

    • secret: 这是一个字符串,用来加密session ID,防止客户端篡改。必须保证它的值在生产环境中保密且不可更改。
    • resave: 如果设置为 false,则不会将未修改的会话保存回存储器。
    • saveUninitialized: 如果设置为 true,则会在会话被初始化之前将其保存到存储器。
    • cookie.maxAge: 设置session的过期时间,单位为毫秒。在这个例子中,我们设置了30分钟。
  2. 使用session

    • 在根路径 / 上,我们检查是否已经存在views属性。如果存在,则递增并显示当前的视图计数;如果不存在,则初始化它并显示欢迎信息。
  3. 启动服务器

    • 最后,我们启动一个监听端口的服务器,默认为3000。

通过上述配置,你应该能够正确地使用express-session来管理用户的会话状态。


3.X的同样失效的,看了源码没看出原因,发现cookie的时间不会改变,cookie到了会话时间,请求时在request里找不到cookie。 解决方式是在每个请求时重新设置session某值(值不能样),这样cookie时间是会延长的。 app.use(function (req, res, next) { if(req.session[‘resetCookieTime’]){ req.session[‘resetCookieTime’] = +new Date; } next(); });

求大神指导…

express什么时候更新到4.9了

当然可以。在Express 4.9中使用express-session时,可能会遇到会话失效的问题。这通常是因为配置不当或中间件顺序不正确导致的。以下是一些常见的原因及解决方案,并附上示例代码。

原因

  1. 中间件顺序:确保express-session中间件在所有需要访问会话数据的中间件之前被调用。
  2. 配置错误:确保正确配置了express-session,例如设置了正确的密钥和存储方式。
  3. Cookie配置:确保客户端能够正确接收并保存cookie。

示例代码

const express = require('express');
const session = require('express-session');

const app = express();

// 配置express-session
app.use(session({
    secret: 'your-secret-key', // 用于加密session ID的密钥
    resave: false,             // 强制会话保存到存储中
    saveUninitialized: true,   // 即使没有修改也保存会话
    cookie: {                  // 配置cookie属性
        secure: false,         // 如果为true,则cookie只能通过HTTPS发送
        httpOnly: true,        // 防止JavaScript访问cookie
        maxAge: 60000          // 设置cookie过期时间(毫秒)
    }
}));

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

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

解释

  • secret: 这个值是用于加密会话ID的密钥。你需要一个安全的字符串来保证会话的安全性。
  • resave: 如果设置为false,则不会在每次请求时都重新保存会话,除非会话数据发生变化。
  • saveUninitialized: 如果设置为true,即使会话还未初始化(即尚未调用req.session.save()),也会创建会话。
  • cookie: 设置cookie的属性,如maxAge指定了cookie的过期时间。

确保你的应用中没有其他地方覆盖了这些配置,或者中间件的顺序不正确,这会导致会话无法正常工作。

回到顶部