Session

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("服务器已经启动~~~~");
});

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值