3、node中怎麼使用session(轉)
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")3.開啟cookie並且配置session的內容
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("查詢成功") })6.刪除session
app.get("/del",function(req,res){ req.session.destroy(); res.redirect("http://www.baidu.com"); //刪除成功後轉到百度頁面 res.send("刪除成功") })
7.監聽埠
app.listen(8000,function(){ console.log('http://127.0.0.1:8000') })node中的session是將值儲存在記憶體中了,不能直接在瀏覽器中進行檢視;
所以將session再寫入到cookie中,再瀏覽器中檢視到的就是session儲存的時候對應的檔名
注意:session中id是關鍵詞,不能在裡面存id,跟session中預設的欄位衝突
8.頁面提示
app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); });
res.locals.error = '使用者名稱或密碼不正確'; res.render('login'); return;
9.路由驗證
通過session
10. crypto加密
npm install crypto
路由引入
varcrypto=require('crypto');//加密var password1 = req.body.password1; var md5 = crypto.createHash('md5'); var userPwd = md5.update(password1).digest('hex');