小白请教Nodejs session的使用
小白请教Nodejs session的使用
刚接触nodejs 没多久,目前在做自己的第一个nodejs项目,请教各位大神,session如何使用,有没有合适的插件
当然可以!在 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');
});
解释
-
配置 session 中间件:
secret
:用于加密 session ID 的密钥,确保安全性。resave
:是否强制保存未修改的会话。saveUninitialized
:创建未初始化的会话。cookie.maxAge
:设置 cookie 的过期时间。
-
登录路由:
- 接收 POST 请求中的用户名和密码。
- 如果验证成功,将用户信息存储在
req.session.user
中,并返回登录成功的消息。
-
受保护的路由:
- 检查
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)。
示例代码
首先,确保你的项目安装了express
和express-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来加密会话数据,以增加安全性。