1、Cookie HTTP是無狀態協議。例:打開一個功能變數名稱的首頁,進而打開該功能變數名稱的其他頁面,伺服器無法識別訪問者。即同一瀏覽器訪問同一網站,每次訪問都沒有任何關係。 Cookie的原理是:客戶端瀏覽器在第一次訪問伺服器後,伺服器返回一段json數據進行標識,此後當客戶端瀏覽器再次訪問同一個域時,每次都 ...
1、Cookie
HTTP是無狀態協議。例:打開一個功能變數名稱的首頁,進而打開該功能變數名稱的其他頁面,伺服器無法識別訪問者。即同一瀏覽器訪問同一網站,每次訪問都沒有任何關係。
Cookie的原理是:客戶端瀏覽器在第一次訪問伺服器後,伺服器返回一段json數據進行標識,此後當客戶端瀏覽器再次訪問同一個域時,每次都攜帶此cookie信息。
特點
- cookie是不加密的,用戶可以自由看到;
- 用戶可以刪除cookie,或者禁用它,未設置失效時間,則預設關閉瀏覽器後失效
- cookie可以被篡改
- cookie可以用於攻擊
- cookie存儲量很小。(小於4k)
Cookie具有不可跨功能變數名稱性。根據Cookie規範,瀏覽器訪問Google只會攜帶Google的Cookie,而不會攜帶Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。
cookie在Node.js中使用:
1 const cookieParser = require('cookie-parser'); //模塊 cookie-parser 2 const app = express(); 3 app.use(cookieParser()); //中間件 4 app.get('/',(req,res)=>{ 5 res.send('根路由'); 6 }) 7 app.get('/login',(req,res)=>{ 8 //獲取客戶端cookies 9 console.log(req.cookies); 10 11 //伺服器下發cookie 12 res.cookie('heaven','666',{ 13 maxAge:900000 //有效時間,毫秒 14 }); 15 res.send('ok'); 16 }) 17 18 app.listen(3000);
2、Session
伺服器需要記錄用戶的狀態,依賴cookie跟蹤session,第一次創建session時,服務端會在HTTP協議中告訴客戶端,需要在cookie裡面記錄一個session ID,以後客戶端每次請求攜帶此session ID,伺服器就能識別客戶端。
特點
- Session不是一個天生就有的技術,而是依賴cookie。當一個瀏覽器禁用cookie的時候,登錄效果消失;或者用戶清除了這個cookie,登錄也消失;
- session比cookie不一樣在哪裡呢?session下發的是亂碼,並且伺服器自己緩存一些東西;下次瀏覽器帶著亂碼上來,此時與緩存進行比較,看看是誰?
/* session 數據存放在服務端,但索引存放在瀏覽器,瀏覽器是根據cookieid識別對應的session npm i express-session -S 使用session模塊 */ const express = require('express'); const session = require('express-session'); // 解析session的模塊 express-session const app = express(); //啟動session的中間件,公式 app.use(session({ //要求客戶端設置一個加密的cookie secret:'heaven', //任意字元都行,給cookie加密 cookie:{maxAge:300000}, resave:true, saveUninitialized:true, })) //中間件是按先後順序執行的,所以放在前面攔截 app.get('/favicon.ico',(req,res)=>{ return; }) app.get('/',(req,res)=>{ res.send('你的足跡是'+req.session.lvyou); }) app.get('/:city',(req,res)=>{ let city = req.params.city; // console.log(req.session); let cityArr = req.session.lvyou || []; cityArr.push(city); req.session.lvyou = cityArr; res.send("你今天去了"+city); }) app.listen(3000);
/* 將session從記憶體中提取到mongo資料庫內 npm i connect-mongo -S 將session存入mongo資料庫的模塊 */ const express = require("express"), app = express(), session = require("express-session"), Mongosession = require("connect-mongo")(session), mongoose = require("mongoose"); //連接資料庫 mongoose.connect("mongodb://localhost/bounty",{useNewUrlParser: true}) //session公式 app.use(session({ secret:"doukeyi", //秘鑰,加密 rolling:true, //每次交互(操作頁面,a標簽,ajax)重新設定時間 cookie:{maxAge:1000*60*60}, //cookie有效期 1小時 resave:false, //是否每次請求都重新保存數據 saveUninitialized:false, //是否預設設置初始值 store:new Mongosession({ url:"mongodb://localhost/bounty" //session存入資料庫,到期後自動清除資料庫 }) })) /* 清除session */ router.get("/logout",function (req,res) { req.session.destroy(); res.redirect("/login"); })
3、區別
- cookie是明碼;session是亂碼;
- cookie存在客戶端瀏覽器; session存在伺服器;
- cookie記憶體小;session記憶體大;