express-session
官网: https://github.com/expressjs/sessionhtml
★cookie 和 session 的区别:node
二者都一般用于保存用户状态用来验证用户身份;git
cookie 是存储在浏览器端的.
session 是存储在服务器端的.github
与cookie相比,用session来存储用户我的信息,cookie能够看到用户id之类的,而session在本地客户端只能看到惟一的随机字符串,相对来讲比较安全(互联网没有绝对安全)。express
建议:将登录信息等重要信息存放为session、其余信息若是须要保留,能够放在cookie中npm
☆ 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名称
}));cookie
各参数意义: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
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>