Session 簡單介紹
session 是另一種記錄客戶狀態的機制,不同的是 Cookie 保存在客戶端瀏覽器中,而 session 保存在服
務器上。
Session 的用途:
session 運行在服務器端,當客戶端第一次訪問服務器時,可以將客戶的登錄信息保存。 當客戶訪問其他頁面時,可以判斷客戶的登錄狀態,做出提示,相當於登錄攔截。
session 可以和 Redis 或者數據庫等結合做持久化操作,當服務器掛掉時也不會導致某些客戶信息(購物車) 丟失。
session 可以和 Redis 或者數據庫等結合做持久化操作,當服務器掛掉時也不會導致某些客戶信息(購物車) 丟失。
Session 的工作流程
當瀏覽器訪問服務器並發送第一次請求時,服務器端會創建一個 session 對象,生成一個類似於 key,value 的鍵值對,然后將 key(cookie)返回到瀏覽器(客戶)端,瀏覽器下次再訪問時,攜帶 key(cookie), 找到對應的 session(value)。 客戶的信息都保存在 session 中
express-session 的使用:
1.安裝 express-session
cnpm install express-session --save
2.引入 express-session
var session = require("express-session");
3.設置官方文檔提供的中間件
app.use(session({
secret: 'keyboard cat',
resave: true, saveUninitialized: true
}))
4.使用
設置值 req.session.username = "張三";
獲取值 req.session.username
express-session 的常用參數:
app.use(session({ secret: '12345', name: 'name', cookie: {maxAge: 60000},
resave: false,
saveUninitialized: true }));
參數
|
作用
|
secret
|
一個 String 類型的字符串,作為服務器端生成 session 的簽名。
|
name
|
返回客戶端的 key 的名稱,默認為 connect.sid,也可以自己設置。
|
resave
|
強制保存 session 即使它並沒有變化,。默認為 true。建議設置成 false。 don't save session if unmodified
|
saveUninitialized
|
強制將未初始化的 session 存儲。當新建了一個 session 且未設定屬性或值時,它就處於
|
未初始化狀態。在設定一個 cookie 前,這對於登陸驗證,減輕服務端存儲壓力,權限控制是有幫助的。(默 認:true)。建議手動添加。
|
|
cookie
|
設置返回到前端 key 的屬性,默認值為{ path: ‘/’, httpOnly: true, secure: false, maxAge: null }。
|
rolling
|
在每次請求時強行設置 cookie,這將重置 cookie 過期時間(默認:false)
|
express-session 的常用方法:
req.session.destroy(function(err) { /*銷毀 session*/ })
req.session.username='張三'; //設置 session
req.session.username //獲取 session
req.session.cookie.maxAge=0; //重新設置 cookie 的過期時間
負載均衡配置 Session,把 Session 保存到數據庫 里面
demo:
1.需要安裝express-session 和 connect-mongo模塊
2.引入模塊
var session = require("express-session");
const MongoStore = require('connect-mongo')(session);
3.配置中間件
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: true,
rolling:true,
cookie:{
maxAge:100000
},
store: new MongoStore({
url: 'mongodb://127.0.0.1:27017/student',
touchAfter: 24 * 3600 // time period in seconds
})
}))
Cookie 和 Session 區別
1、cookie 數據存放在客戶的瀏覽器上,session 數據放在服務器上。
2、cookie 不是很安全,別人可以分析存放在本地的 COOKIE 並進行 COOKIE 欺騙 考慮到安全應當使用 session。
3、session 會在一定時間內保存在服務器上。當訪問增多,會比較占用你服務器的性能 考慮到減輕服務器性能方面,應當使用 COOKIE。
4、單個 cookie 保存的數據不能超過 4K,很多瀏覽器都限制一個站點最多保存 20 個 cookie。
/* * 1.安裝 express-session cnpm install express-session --save * * * 2.引入 var session = require("express-session"); 3.設置官方文檔提供的中間件 app.use(session({ secret: 'keyboard cat', resave: false, saveUninitialized: true })) 4.使用 設置值 req.session.username = "張三"; 獲取值 req.session.username * */
var express = require("express"); var app = express(); var session = require("express-session"); //配置中間件
app.use(session({ secret: 'this is string key', // 可以隨便寫。 一個 String 類型的字符串,作為服務器端生成 session 的簽名
name:'session_id',/*保存在本地cookie的一個名字 默認connect.sid 可以不設置*/ resave: false, /*強制保存 session 即使它並沒有變化,。默認為 true。建議設置成 false。*/ saveUninitialized: true, //強制將未初始化的 session 存儲。 默認值是true 建議設置成true
cookie: { maxAge:5000 /*過期時間*/ }, /*secure https這樣的情況才可以訪問cookie*/
//設置過期時間比如是30分鍾,只要游覽頁面,30分鍾沒有操作的話在過期
rolling:true //在每次請求時強行設置 cookie,這將重置 cookie 過期時間(默認:false)
})) app.get("/",function(req,res){ //獲取sesssion
if(req.session.userinfo){ /*獲取*/ res.send('你好'+req.session.userinfo+'歡迎回來'); }else{ res.send('未登錄'); } }); app.get("/login",function(req,res){ req.session.userinfo='張三222'; res.send('登錄成功'); }); app.get("/news",function(req,res){ //獲取sesssion
if(req.session.userinfo){ /*獲取*/ res.send('你好'+req.session.userinfo+'歡迎回來 news'); }else{ res.send('未登錄 news'); } }); app.listen(3000);
/* * 1.安裝 express-session cnpm install express-session --save * * * 2.引入 var session = require("express-session"); 3.設置官方文檔提供的中間件 app.use(session({ secret: 'keyboard cat', resave: false, saveUninitialized: true })) 4.使用 設置值 req.session.username = "張三"; 獲取值 req.session.username * */
var express = require("express"); var app = express(); var session = require("express-session"); //配置中間件
app.use(session({ secret: 'this is string key', // 可以隨便寫。 一個 String 類型的字符串,作為服務器端生成 session 的簽名
name:'session_id',/*保存在本地cookie的一個名字 默認connect.sid 可以不設置*/ resave: false, /*強制保存 session 即使它並沒有變化,。默認為 true。建議設置成 false。*/ saveUninitialized: true, //強制將未初始化的 session 存儲。 默認值是true 建議設置成true
cookie: { maxAge:1000*30*60 /*過期時間*/ }, /*secure https這樣的情況才可以訪問cookie*/
//設置過期時間比如是30分鍾,只要游覽頁面,30分鍾沒有操作的話在過期
rolling:true //在每次請求時強行設置 cookie,這將重置 cookie 過期時間(默認:false) })) app.get("/",function(req,res){ //獲取sesssion
if(req.session.userinfo){ /*獲取*/ res.send('你好'+req.session.userinfo+'歡迎回來'); }else{ res.send('未登錄'); } }); app.get("/login",function(req,res){ req.session.userinfo='張三222'; res.send('登錄成功'); }); app.get("/loginOut",function(req,res){ //req.session.cookie.maxAge=0; /*改變cookie的過期時間*/
//銷毀
req.session.destroy(function(err){ console.log(err); }) res.send('退出登錄成功'); }); app.get("/news",function(req,res){ //獲取sesssion
if(req.session.userinfo){ /*獲取*/ res.send('你好'+req.session.userinfo+'歡迎回來 news'); }else{ res.send('未登錄 news'); } }); app.listen(3000);
/* * 1.需要安裝 express-session 和 connect-mongo 模塊 cnpm install express-session --save cnpm install connect-mongo --save 2.引入 var session = require("express-session"); var MongoStore = require("connect-mongo")(session); 3.設置官方文檔提供的中間件 app.use(session({ secret: 'keyboard cat', resave: false, saveUninitialized: true, store:new MongoStore({ url: 'mongodb://127.0.0.1:27017/student',數據庫的地址 touchAfter: 24 * 3600 time period in seconds }) })) 4.使用 設置值 req.session.username = "張三"; 獲取值 req.session.username * */
var express = require("express"); var app = express(); var session = require("express-session"); var MongoStore = require("connect-mongo")(session); //配置中間件
app.use(session({ secret: 'this is string key', // 可以隨便寫。 一個 String 類型的字符串,作為服務器端生成 session 的簽名
name:'session_id',/*保存在本地cookie的一個名字 默認connect.sid 可以不設置*/ resave: false, /*強制保存 session 即使它並沒有變化,。默認為 true。建議設置成 false。*/ saveUninitialized: true, //強制將未初始化的 session 存儲。 默認值是true 建議設置成true
cookie: { maxAge:1000*30*60 /*過期時間*/ }, /*secure https這樣的情況才可以訪問cookie*/ rolling:true,//在每次請求時強行設置 cookie,這將重置 cookie 過期時間(默認:false)
store:new MongoStore({ url: 'mongodb://127.0.0.1:27017/shop', //數據庫的地址
touchAfter: 24 * 3600 //time period in seconds 通過這樣做,設置touchAfter:24 * 3600,您在24小時內只更新一次會話,不管有多少請求(除了在會話數據上更改某些內容的除外)
}) })) app.get("/",function(req,res){ //獲取sesssion
if(req.session.userinfo){ /*獲取*/ res.send('你好'+req.session.userinfo+'歡迎回來'); }else{ res.send('未登錄'); } }); app.get("/login",function(req,res){ req.session.userinfo='張三222'; res.send('登錄成功'); }); app.get("/loginOut",function(req,res){ //req.session.cookie.maxAge=0; /*改變cookie的過期時間*/
//銷毀
req.session.destroy(function(err){ console.log(err); }) res.send('退出登錄成功'); }); app.get("/news",function(req,res){ //獲取sesssion
if(req.session.userinfo){ /*獲取*/ res.send('你好'+req.session.userinfo+'歡迎回來 news'); }else{ res.send('未登錄 news'); } }); app.listen(3000);