express中的cookie和session

1、無狀態的http

http是無狀態協議, 簡單的說, 當你瀏覽了一個頁面, 而後轉到同一個網站的另外一個頁面, 服務器沒法認識到, 這是同一個瀏覽器在訪問同一個網站,換句話說,服務器沒法識別兩條http請求是不是同一個用戶發送的。也就是說服務器端並無記錄通訊狀態的能力。 可是, 爲了用戶體驗, 咱們確實須要讓服務器可以記憶用戶的一些信息。 cookie應運而生redis

2、cookie

cookie是一個簡單到爆的想法: 當訪問一個頁面的時候,服務器在下行http報文中,命令瀏覽器存儲一個字符串;瀏覽器再訪問同一個域的時候,將把這個字符串攜帶到上行http請求中。數據庫

第一次訪問第一個服務器,不可能攜帶cookie。必須是服務器獲得此次請求,在下行響應報頭中,攜帶cookie信息,此後每一次瀏覽器往這個服務器發出的請求,都會攜帶這個cookieexpress

cookie特色:npm

  • 1.cookie 是不加密的,用戶能夠自由看到
  • 2.用戶能夠刪除cookie或者禁用它
  • 3.cookie能夠被篡改
  • 4.cookie能夠用於攻擊
  • 5.cookie 存儲量很小。

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

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)
複製代碼
相關文章
相關標籤/搜索