cookie 雖然很方便,但是使用 cookie 有一個很大的弊端,cookie 中的所有數據在客戶端就可以被修改,數據非常容易被偽造,那么一些重要的數據就不能存放在 cookie 中了,而且如果 cookie 中數據字段太多會影響傳輸效率。為了解決這些問題,就產生了 session,session 中的數據是保留在服務器端的。
session 的運作通過一個 session_id 來進行。session_id 通常是存放在客戶端的 cookie 中,比如在 express 中,默認是 connect.sid 這個字段,當請求到來時,服務端檢查 cookie 中保存的 session_id 並通過這個 session_id 與服務器端的 session data 關聯起來,進行數據的保存和修改。
這意思就是說,當你瀏覽一個網頁時,服務端隨機產生一個 1024 比特長的字符串,然后存在你 cookie 中的 connect.sid 字段中。當你下次訪問時,cookie 會帶有這個字符串,然后瀏覽器就知道你是上次訪問過的某某某,然后從服務器的存儲中取出上次記錄在你身上的數據。由於字符串是隨機產生的,而且位數足夠多,所以也不擔心有人能夠偽造。偽造成功的概率比坐在家里編程時被鄰居家的狗突然闖入並咬死的幾率還低。
session 可以存放在
1)內存
2)cookie本身
3)redis 或 memcached 等緩存中
4)數據庫中
線上來說,緩存的方案比較常見,存數據庫的話,查詢效率相比前三者都太低,不推薦;
express 中操作 session 要用到 express-session (https://github.com/expressjs/session ) 這個模塊,主要的方法就是 session(options),其中 options 中包含可選參數,主要有:
- name: 設置 cookie 中,保存 session 的字段名稱,默認為
connect.sid。 - store: session 的存儲方式,默認存放在內存中,也可以使用 redis,mongodb 等。express 生態中都有相應模塊的支持。
- secret: 通過設置的 secret 字符串,來計算 hash 值並放在 cookie 中,使產生的 signedCookie 防篡改。
- cookie: 設置存放 session id 的 cookie 的相關選項,默認為
- (default: { path: '/', httpOnly: true, secure: false, maxAge: null })
- genid: 產生一個新的 session_id 時,所使用的函數, 默認使用
uid2這個 npm 包。 - rolling: 每個請求都重新設置一個 cookie,默認為 false。
- resave: 即使 session 沒有被修改,也保存 session 值,默認為 true。
npm install express-session
npm install cookie-parser
2.引入包
var express=require("express") var app=express() //引用session var session=require("express-session"); var cookieParser=require("cookie-parser")
app.use(cookieParser()) // express中是把session信息存儲在內存中 // 配置session app.use(session({ secret:"dsafsafsf", //設置簽名秘鑰 內容可以任意填寫 cookie:{ maxAge:80*1000 }, //設置cookie的過期時間,例:80s后 session和相應的cookie失效過期 resave:true, //強制保存,如果session沒有被修改也要重新保存 saveUninitialized:false //如果原先沒有session那么久設置,否則不設置 }))
4.設置session里面的內容
app.get("/add",function(req,res){ //往session里存儲數據 req.session.name='jack'; //loginok:可以是任意內容,可以為true或false res.send("添加成功") })
5.讀取session里面的內容
//讀取session app.get("/select",function(req,res){ //查看session console.log(req.session) res.send("查詢成功") })
app.get("/del",function(req,res){ req.session.destroy(); res.redirect("http://www.baidu.com"); //刪除成功后轉到百度頁面 res.send("刪除成功") })
7.監聽端口
app.listen(8080);
node中的session是將值存儲在內存中了,不能直接在瀏覽器中進行查看;
所以將session再寫入到cookie中,再瀏覽器中查看到的就是session存儲的時候對應的文件名
注意:session中id是關鍵詞,不能在里面存id,跟session中默認的字段沖突
