http是無狀態協議, 簡單的說, 當你瀏覽了一個頁面, 而後轉到同一個網站的另外一個頁面, 服務器沒法認識到, 這是同一個瀏覽器在訪問同一個網站,換句話說,服務器沒法識別兩條http請求是不是同一個用戶發送的。也就是說服務器端並無記錄通訊狀態的能力。 可是, 爲了用戶體驗, 咱們確實須要讓服務器可以記憶用戶的一些信息。 cookie應運而生redis
cookie是一個簡單到爆的想法: 當訪問一個頁面的時候,服務器在下行http報文中,命令瀏覽器存儲一個字符串;瀏覽器再訪問同一個域的時候,將把這個字符串攜帶到上行http請求中。數據庫
第一次訪問第一個服務器,不可能攜帶cookie。必須是服務器獲得此次請求,在下行響應報頭中,攜帶cookie信息,此後每一次瀏覽器往這個服務器發出的請求,都會攜帶這個cookieexpress
cookie特色:npm
express中的cookie,你確定能想到。 res負責設置cookie, req負責識別cookie。 在express中的使用:cookie-parser瀏覽器
1/安裝
npm i -S cookie-parser
複製代碼
cookie 中間件的參數:
path:指定 cookie 影響到的路徑
expires: 指定時間格式
maxAge:指定 cookie 何時過時
secure:當 secure 值爲 true 時,在 HTTPS 中才有效;反之,cookie 在 HTTP 中是有效。
httpOnly:瀏覽器不容許腳本操做 document.cookie 去更改 cookie。設置爲true能夠避免被 xss 攻擊拿到 cookie
複製代碼
const cookieParser = require('cookie-parser');
app.use(cookieParser());
app.get("/a", (req, res) => {
console.log(req.cookies) //讀取cookie
res.cookie("amount", 99.8, { //設置cookie
//domain:設置主域名//(子域名能夠找主域名,主域名不能夠找子域名;通常狀況下一個網站一個cookie)
//path:"/" //cookie是保存在根路徑下的,爲了防止訪問不到 (不能往下訪問只能往上訪問)
//secure: 當 secure 值爲 true 時, 在 HTTPS 中才有效; 反之, cookie 在 HTTP 中是有效。
//httpOnly:瀏覽器不容許腳本操做 document.cookie 去更改 cookie。設置爲true能夠避免被 xss 攻擊拿到 cookie
maxAge: 14 * 86400 * 1000 //有效期
})
res.send("ok")
})
複製代碼
簡單模擬登陸
const cookieParser = require('cookie-parser');
app.use(cookieParser(
"ggffdaasadada123ghgfhf8gghgh" //簽名
));
app.get("/a", (req, res) => {
let num = 0;
console.log(req.cookies) //讀取未簽名cookie
console.log(req.signedCookies) //讀取簽名cookie
if (req.cookies.amount) {
res.send("歡迎回來")
} else {
res.cookie("amount", "hello", {
maxAge: 14 * 86400 * 1000, //有效期
signed: true //是否須要簽名的
})
}
res.send("請先登陸")
})
複製代碼
session在計算機網絡應用中被稱爲「會話控制」, 客戶端瀏覽器訪問網站的時候,服務器會向客戶瀏覽器發送一個每一個用戶特有的會話編號sessionID,讓他進入到cookie裏,服務器同時也把sessionID和對應的用戶信息、用戶操做記錄在服務器上,這些記錄就是session。客戶端瀏覽器再次訪問時,會發送cookie給服務器,其中就包含sessionID。服務器從cookie裏找到sessionID,再根據sessionID找到之前記錄的用戶信息就能夠知道他以前操控些、訪問過哪裏。安全
Session不是一個天生就有的技術,而是依賴cookiebash
session是存在服務器端的技術,cookie是存儲在客戶端的技術服務器
cookie以文本格式存儲在瀏覽器上,存儲量有限;而會話存儲在服務端,能夠無限量存儲多個變量而且比cookie更安全cookie
session相比cookie而言要安全一些,由於他是存儲在服務器的;cookie是明文(也可加密)存儲在客戶端(瀏覽器),並且每次請求都會附帶發送(可使用抓包工具獲取cookie,不安全)網絡
cookie若是存儲內容比較多的話,會給請求形成壓力 session由於是存儲在服務器的,因此若是過多的依賴session會形成服務器壓力(內存和硬盤的壓力)
1/安裝
npm i -S express-session
複製代碼
2/session 中間件的配置參數:
name: 設置cookie中,保存session的字段名稱,默認爲connect.sid
store: session的存儲方式,默認爲存放在內存中,咱們能夠自定義redis等
genid: 生成一個新的session_id時,默認爲使用uid2這個npm包
rolling: 每一個請求都從新設置一個cookie,默認爲false
resave: 即便session沒有被修改,也保存session值,默認爲true
saveUninitialized:強制未初始化的session保存到數據庫
secret: 經過設置的secret字符串,來計算hash值並放在cookie中,使產生的signedCookie防篡改
cookie : 設置存放sessionid的cookie的相關選項
複製代碼
2.const express = require("express");
const app = express();
const session = require("express-session");
app.use(session({
secret : 'secret', // 對session id 相關的cookie 進行簽名
resave : true,
saveUninitialized: false, // 是否保存未初始化的會話
cookie : {
maxAge : 1000 * 60 * 3, // 設置 session 的有效時間,單位毫秒
},
}));
app.get("/", (req, res) => {
// console.log(req.session);
if (!req.session['view']) {
req.session['view'] = 1;
} else {
req.session['view']++;
}
req.session['amount'] = 99.8;
res.send(`歡迎你第${req.session["view"]}次登錄,你的餘額是:${req.session['amount']}`)
})
app.listen(3000)
複製代碼