session(会话):
- session的机制类似于我们用的银行卡
- 银行卡中并没有真正的钱,钱都是在银行的账户中保存,
而银行卡里只是保存了这个账户的账号,通过账号可以去操作指定的账户
- session是在服务器中为每一个浏览器都创建一个对象,这个对象用来保存浏览器在访问过程中产生的数据,
每一个对象都有一个唯一的id,将id以cookie的形式发送给浏览器,浏览器每次访问都会发回该cookie,
这样我们就可以通过cookie找到其对应的session对象。
- session是依赖于cookie的
- Express默认不支持session,需要引入一个中间件
- cookie的值是保存的客户端,而session是保存到服务器
相比cookie,session更加安全,而且session可以保存任意多的内容没有任何限制
接下来在例子中继续了解session;
session使用步骤:
1.下载安装
npm i express-session --save
2.引入
var session = require("express-session");
3.将其设置为中间件
app.use(session({
resave:false,
saveUninitialized:false,
secret:"hello"
}));
secret属性是用来给session加密的,属性值自己指定;
session的使用流程:
session的使用流程
- 当第一次使用req.session时,服务器会自动创建一个全新session对象
每一个session对象都会有一个唯一id(sessionid)
- 当对象创建完毕以后,服务器会将sessionid以cookie的形式发送给浏览器
set-cookie: connect.sid=s%3AUuHWxUt1bvr4foD7ITX4_ruSKUBG0p1Y.8GuawyCH4UeyIRRGAsqeHyrnHEGLN91duwUFu1R%2FpwY; Path=/; HttpOnly
- 当浏览器收到cookie以后,会自动将cookie保存,下次访问服务器时,会将该cookie发回,
服务器收到请求,会首先读取浏览器的cookie,检查cookie中是否含有connect.sid如果没有,则重复第一步,
如果有,则会自动根据cookie值,去服务器中寻找session对象,并返回
var express = require("express");
var app = express();
//引入session的中间件,以使Express来支持session
var session = require("express-session");
app.use(session({
resave:false,
saveUninitialized:false,
secret:"hello"
}));
//配置页面的路由
app.get("/ts",function (req , res) {
//console.log(req.session);
/*
session的使用流程
- 当第一次使用req.session时,服务器会自动创建一个全新session对象
每一个session对象都会有一个唯一id(sessionid)
- 当对象创建完毕以后,服务器会将sessionid以cookie的形式发送给浏览器
set-cookie: connect.sid=s%3AUuHWxUt1bvr4foD7ITX4_ruSKUBG0p1Y.8GuawyCH4UeyIRRGAsqeHyrnHEGLN91duwUFu1R%2FpwY; Path=/; HttpOnly
- 当浏览器收到cookie以后,会自动将cookie保存,下次访问服务器时,会将该cookie发回,
服务器收到请求,会首先读取浏览器的cookie,检查cookie中是否含有connect.sid如果没有,则重复第一步,创建session
如果有,则会自动根据cookie值,去服务器中寻找session对象,并返回
*/
//向session中添加一个属性
req.session.username = "孙悟空";
res.send("testSession路由返回的内容");
});
app.get("/ts2",function (req , res) {
res.send("testSession2"+ req.session.username);
});
app.listen(3000 , function () {
console.log("ok");
});
Session的持久化:
- Session对象是保存到程序中,也就是实际上是存在于内存里,
这样会导致程序一旦重启,则所有的Session对象都会丢失,
这样导致用户存储到Session的数据丢失,会造成一个不好的用户体验
- Session的持久化指将Session对象保存到硬盘中(文件、数据库),
这样即使服务器重启,Session也不会丢失。
- 我们可以通过 connect-mongo 来对Session进行持久化
该模块会将Session的数据保存到MongoDB数据库中,当客户端请求时,服务器会自动去数据库中查询session是否存在
使用 connect-mongo 来对Session进行持久化
1.下载安装
npm i connect-mongo --save
2.引入connect-mongo
var MongoStore = require('connect-mongo')(session);
3.将connect-mongo设置为session的仓库
app.use(session({
resave:false,
saveUninitialized:false,
secret:"www",
store:new MongoStore({mongooseConnection:mongoose.connection})
}));
//引入express
var express = require("express");
//连接MongoDB数据库
require("./tools/conn_mongo");
//引入router
var router = require("./routers/router");
var bodyParser = require("body-parser");
//引入mongoose
var mongoose = require("mongoose");
//引入session
var session = require("express-session");
//引入connect-mongo
var MongoStore = require('connect-mongo')(session);
/*var cm = require("connect-mongo");
var MongoStroe = cm(session);*/
/*
使用 connect-mongo 来对Session进行持久化
1.下载安装
npm i connect-mongo --save
2.引入connect-mongo
var MongoStore = require('connect-mongo')(session);
3.将connect-mongo设置为session的仓库
app.use(session({
resave:false,
saveUninitialized:false,
secret:"www",
store:new MongoStore({mongooseConnection:mongoose.connection})
}));
*/
//获取app对象
var app = express();
//在app中放置一个空的msg对象
app.locals.msg = {};
//设置模板引擎
app.set("view engine" , "ejs");
//设置保存模板的目录
app.set("views" , "./views");
//配置静态资源
app.use(express.static("public"));
//引入bodyParser
app.use(bodyParser.urlencoded({extended:false}));
//配置session的中间件
app.use(session({
resave:false,
saveUninitialized:false,
secret:"atguigu",
store:new MongoStore({mongooseConnection:mongoose.connection})
}));
//将session放入到res.locals中,所有的ejs页面都可以访问到session了
app.use(function (req , res , next) {
res.locals.session = req.session;
next();
});
//配置路由
app.use(router);
//在最后,添加一个中间件
app.use(function (req , res) {
//一旦进入该路由,则证明路径错误
res.status(404);
res.render("404.ejs");
});
//监听3000端口,并启动服务器
app.listen(3000,function () {
console.log("服务器已经启动~~~~");
});