小白请教Nodejs session的使用

小白请教Nodejs session的使用

刚接触nodejs 没多久,目前在做自己的第一个nodejs项目,请教各位大神,session如何使用,有没有合适的插件

7 回复

当然可以!在 Node.js 中使用 Session 是一个非常常见的需求。Session 主要用于在服务器端存储用户会话信息,比如登录状态、用户信息等。我们可以使用一些成熟的库来实现这一功能,比如 express-session

安装 express-session

首先,你需要安装 express-session 这个库。如果你还没有安装 Express,也可以一起安装:

npm install express express-session

示例代码

下面是一个简单的示例代码,展示如何在 Express 应用中使用 express-session

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

const app = express();

// 配置 session 中间件
app.use(session({
  secret: 'your_secret_key', // 用于加密 session ID 的密钥
  resave: false,              // 强制保存未修改的会话
  saveUninitialized: true,    // 创建未初始化的会话
  cookie: { 
    maxAge: 60000             // 设置 cookie 的过期时间(毫秒)
  }
}));

// 登录路由
app.post('/login', (req, res) => {
  const username = req.body.username;
  const password = req.body.password;

  // 假设验证成功
  if (username === 'admin' && password === 'password') {
    req.session.user = { username: 'admin' };
    res.send('登录成功');
  } else {
    res.status(401).send('用户名或密码错误');
  }
});

// 受保护的路由
app.get('/protected', (req, res) => {
  if (req.session.user) {
    res.send(`欢迎回来,${req.session.user.username}`);
  } else {
    res.status(401).send('未授权访问');
  }
});

// 启动服务器
app.listen(3000, () => {
  console.log('服务器运行在 http://localhost:3000');
});

解释

  1. 配置 session 中间件

    • secret:用于加密 session ID 的密钥,确保安全性。
    • resave:是否强制保存未修改的会话。
    • saveUninitialized:创建未初始化的会话。
    • cookie.maxAge:设置 cookie 的过期时间。
  2. 登录路由

    • 接收 POST 请求中的用户名和密码。
    • 如果验证成功,将用户信息存储在 req.session.user 中,并返回登录成功的消息。
  3. 受保护的路由

    • 检查 req.session.user 是否存在,如果存在则显示欢迎信息,否则返回未授权访问。

通过这种方式,你可以轻松地在 Node.js 应用中实现 session 功能。希望这对你有帮助!


目前使用大家都推荐的express 。正在研究 如何清空session实现 logout

我的例子:

    block.logout = function(req, res){
        delete req.session.user;
        res.redirect('/');
    };

为什么总是提示 cannot set property ‘user’ of undefined

我在app.js 引用了 app.use(express.session({}));

在index.js的app.post(’/reg’,function(req,res){ … req.sesstion.user=newUser; … })

我没有使用框架,在假设活动用户不太多(如企业应用)的情况下,直接写了个常驻内存的session对象,因为简单,感觉效率非常高。代码摘录如下,供参考(本人是新手,老鸟勿喷): //session.js module.exports=function(){ var sql=require(‘msnodesql’).query; //我使用SQL Server var conn_string=require(’./configure’).sqlConnectionString; var querystring=require(‘querystring’); var sessions=[]; this.isInSession=function(req){ if(!req){return false;} if(sessions.length<=0){return false;} var id=objectifyUpComingCookie(req).raw2_uid; for(var i=0;i<sessions.length;i++){ if(sessions[i]==id){return true;} } return false; } ; this.addSession=function(id){ if(!id){return null;} if(this.isInSession(id)){return id;} sessions.push(id); return id; }; this.deleteSession=function(id){ sessions=sessions.splice(id); } ; this.signOut=function(req){ this.deleteSession(objectifyUpComingCookie(req).raw2_uid); }; this.signIn=function(req,cb){ var t=this; var info=’’; req .on(‘data’,function(chunk){info+=chunk;}) .on(‘end’,function(){ info=querystring.parse(info); var sql_string=“SELECT id,name FROM users WHERE name=’”+info.uname+"’ AND password=’"+info.pwd+"’"; //开发阶段,此处暂未加密处理,请勿喷 sql(conn_string,sql_string,function(error,data){ if(data){ t.addSession(data[0].id); cb(null,data); } else{ cb(error); } }) ; }); } ;

    function objectifyUpComingCookie(req){
        var _cookies = {};
        req.headers.cookie && req.headers.cookie.split(';').forEach(function( Cookie ) {
            var parts = Cookie.split('=');
            _cookies[ parts[ 0 ].trim() ] = ( parts[ 1 ] || '' ).trim();
        });
        return _cookies;
    }

}

用法为: //app.js var session=new (require(’./session’))(); http.createServer(function(request,response){ route(request,response,session); }).listen(3000);

//route.js module.exports=function(req,res,session){ case ‘/signin’: session.signIn(req,function(err,rlt){ if(err==null){ returnFile(‘content/index.html’,res,{“Set-Cookie”:“raw2_uid=”+rlt[0].id+";maxAge=3600000",“Context-Type”:“text/plain”}); // 登录成功,redirect到主页,同时向客户端增加cookie } else{ returnFile(‘content/signin.html’,res); } }); break; case ‘/signout’: session.signOut(req); returnFile(‘content/signin.html’,res,{{“Set-Cookie”:“raw2_uid=”+rlt[0].id+";maxAge=0",“Context-Type”:“text/plain”}}); //登出,redirect到登录页,同时销毁客户端cookie break; default : //其它路径请求,总是先检查cookie是否在session里,如果不在,redirect到登录页 if(session.isInSession(req)){ //go ahead… …

        } else{
            returnFile('content/signin.html',res);
        }
        break;

}

接下来,打算将authentication放到session.js里,从视图可视、行为限制和数据组限制三个方面设定和管理用户权限。

在Node.js中使用Session,通常需要借助第三方中间件,比如express-session。这个中间件可以帮助你在Express应用中方便地管理会话(session)。

示例代码

首先,确保你的项目安装了expressexpress-session。你可以使用npm来安装:

npm install express express-session

接下来是基本的使用示例:

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

const app = express();

// 配置session中间件
app.use(session({
    secret: 'your-secret-key', // 加密session数据的密钥
    resave: false,             // 强制未初始化的会话进行保存
    saveUninitialized: true,   // 强制创建未初始化的会话
    cookie: {                  // 设置cookie选项
        maxAge: 60000         // 会话过期时间,单位毫秒
    }
}));

// 登录路由示例
app.post('/login', (req, res) => {
    const username = req.body.username;
    const password = req.body.password;

    if (username === 'admin' && password === 'password') {
        req.session.user = {
            id: 1,
            username: 'admin'
        };
        return res.send('登录成功');
    } else {
        return res.send('登录失败');
    }
});

// 受保护的路由示例
app.get('/protected', (req, res) => {
    if (req.session.user) {
        res.send(`欢迎,${req.session.user.username}`);
    } else {
        res.redirect('/login'); // 如果没有用户登录,则重定向到登录页面
    }
});

app.listen(3000, () => console.log('服务器启动在 http://localhost:3000'));

解释

  • secret: 这是一个密钥,用来签名会话ID cookie,确保安全性。
  • resave: 即使会话没有修改,是否也重新保存。
  • saveUninitialized: 在会话被初始化之前是否保存会话。
  • cookie.maxAge: 设置会话的过期时间。

通过这种方式,你可以轻松地在Node.js项目中实现用户认证和会话管理。确保你的应用使用HTTPS来加密会话数据,以增加安全性。

回到顶部