express-session
官网: https://github.com/expressjs/session
★cookie 和 session 的区别:
两者都通常用于保存用户状态用来验证用户身份;
cookie 是存储在浏览器端的.
session 是存储在服务器端的.
与cookie相比,用session来存储用户个人信息,cookie可以看到用户id之类的,而session在本地客户端只能看到唯一的随机字符串,相对来说比较安全(互联网没有绝对安全)。
建议:将登陆信息等重要信息存放为session、其他信息如果需要保留,可以放在cookie中
☆ nodejs 存储 session 的位置, 是在内存中。每一个登陆用户对应一个 session 信息。
1. 安装 cnpm install express-session --save
2. 引入并设置
var session = require('express-session');
app.use(session({
secret: 'dsfadsafdassadfasdf', //加密 ,必填参数
resave: false, //选填参数 不加会报警告(重写)
//resave:true 强制将session数据进行重写,反之亦然
saveUninitialized: false, // 选填参数 不加会报警告(初始化)
//saveUninitialized: false 用到session时才会去初始化
//saveUninitialized: true 不管用不用到session都会初始化
cookie: { maxAge: 600000 }, //session 的实现是默认依赖 cookie
name: 'niubibu' //session名称
}));
各参数意义:secret
:用来对session数据进行加密的字符串.这个属性值为必须指定的属性。name
:表示cookie的name,默认cookie的name是:connect.sid。
cookie: 设置存放 session id 的 cookie 的相关选项,默认为 (default: { path: '/’, httpOnly: true, secure: false, maxAge: null }) maxAge
:cookie过期时间,毫秒。
resave
:是指每次请求都重新设置session cookie,假设你的cookie是6000毫秒过期,每次请求都会再设置6000毫秒。saveUninitialized
: 是指无论有没有session cookie,每次请求都设置个session cookie ,默认给个标示为 connect.sid。
3. 设置session: req.session.username = 'lisi';
获取session: req.session.username
用于销毁session: req.session.destroy(function(err){ //console.log('shanchu') })
4. session原理:
nodejs 中, session 的实现是默认依赖 cookie。`HttpOnly` 声明该cookie 只能用来进行网络传输, 本地无法操作该 cookie. 禁止浏览器修改 cookie
- httpOnly:是微软对COOKIE做的扩展。如果在COOKIE中设置了“httpOnly”属性,则通过程序(JS脚本、applet等)将无法读取到COOKIE信息,防止XSS攻击产生
5. 实例链接代码
(1)session设置获取
var express =require('express');
var session = require('express-session');
var app = express();
app.use(session({
secret: 'dsfadsafdassadfasdf', //加密 ,必填参数
resave: false, //选填参数 不加会报警告(重写)
//resave:true 强制将session数据进行重写,反之亦然
saveUninitialized: false,// 选填参数 不加会报警告(初始化)
//saveUninitialized: false 用到session时才会去初始化
//saveUninitialized: true 不管用不用到session都会初始化
cookie: { maxAge: 600000 },//session 的实现是默认依赖 cookie
name: 'niubibu'
}));
//设置静态资源目录
app.use(express.static('public'));
app.set('view engine','ejs');
app.set('views','views');
//路由
app.get('/setSession', function(req,res){
//设置session
req.session.username = 'admin';
res.end('set session');
})
//读取session
app.get('/getSession', function(req, res){
console.log(req.session.username);
res.end('get session');
})
app.listen(80);
(2) 模拟登陆操作设置session验证实例:
需求:
// GET /home 网站首页 /detail 商品详情页 不需要登陆
// GET /admin 网站后台 必须要登陆 验证session
// GET /login 显示登陆页面
// POST /login 检测用户参数 账号:admin 密码:admin 登陆成功设置session
var express =require('express');
var session = require('express-session');
var formidable = require('formidable');
var app = express();
app.set('view engine','ejs');
app.set('views','views');
app.use(session({
secret: 'dsfadsafdassadfasdf', //加密 ,必填参数
resave: false, //选填参数 不加会报警告(重写)
//resave:true 强制将session数据进行重写,反之亦然
saveUninitialized: false,// 选填参数 不加会报警告(初始化)
//saveUninitialized: false 用到session时才会去初始化
//saveUninitialized: true 不管用不用到session都会初始化
cookie: { maxAge: 600000 },//session 的实现是默认依赖 cookie
name: 'niubibu'//session名称
}));
// GET /home 网站首页 /detail 商品详情页 不需要登陆
// GET /admin 网站后台 必须要登陆
// GET /login 显示登陆页面
// POST /login 检测用户参数 账号:admin 密码:admin
//首页
app.get('/home', function(req,res){
res.setHeader('content-type','text/html;charset=utf-8');
res.end('网站首页!!!');
});
//详情页
app.get('/detail', function(req,res){
res.setHeader('content-type','text/html;charset=utf-8');
res.end('商品详情页!!!');
});
//后台首页
app.get('/admin', function(req,res){
//检测用户的身份 设置session:admin=1&id=19
if(req.session.admin == 1 && req.session.id) {
res.setHeader('content-type','text/html;charset=utf-8');
res.end('网站后台!!!');
return;
}
res.redirect('/login');
});
//显示登陆
app.get('/login', function(req, res){
res.render('login');
});
//登陆操作
app.post('/login', function(req, res){
//获取用户参数
var form = new formidable.IncomingForm();
form.parse(req, function(err, fields, files) {
//判断
if(fields.username == 'admin' && fields.password == 'admin'){
res.setHeader('content-type','text/html;charset=utf-8');
//登陆成功
//写入session
req.session.admin = 1;
req.session.id = 20;
//3秒后跳转后台页面:第一种方法
// res.redirect('/admin');
// res.end(`登陆成功<script>setTimeout(function(){
// location.href= "/admin";
// },3000)</script>`);
//
//3秒后跳转后台页面:第二种方法
res.render('success',{info: '登陆成功', time: 10000, url: '/admin'});
} else {
res.redirect('/login');
}
});
});
//设置静态资源目录
app.use(express.static('public'));
app.set('view engine','ejs');
app.set('views','views');
app.listen(80);
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆页面</title>
</head>
<body>
<form action="/login" method="POST">
<input type="text" name="username">
<input type="text" name="password">
<button>登陆</button>
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title><%= info %></title>
</head>
<body>
<h1 style="font-size:50px">
:)
</h1>
<h2><%= info %></h2>
<p><%= time/1000 %> 秒之后跳转</p>
<script>
setTimeout(function(){
location.href = '<%= url %>';
}, <%= time %>);
</script>
</body>
</html>