session 不用多介紹,使一個http可以對應一個終端使用者。
session的本質是使用cookie來實現。
原理大概是:http 帶來服務端提前設定 cookie,服務端拿到標示使用者身分的cookie, 再去固定地點(資料庫,檔案)檢索出對應的使用者身分。把身分賦值給本次請求的request,在程式處理中就知曉了使用者的身分了。 (在PHP,ASP或其他服務端語言中都自動幫你實現了)
實作cookie
需要為每個使用者設定一個可以標示使用者身分的cookie。可以使用以下規則
註冊郵箱MD5值+密碼MD5值+隨機碼MD5值。 (僅舉例,這可能不是一個好的方案)
服務端程式碼片段:
res.setHeader("Set-Cookie", ["sid="+newUser.toCookie()+";path=/;domain="+config.domain+";expires="+new Date("2030") ]);
cookie
sid=275fccab7935736ff68c95c3ddbfaaee|275fccab7935736ff68c95c3ddbfaaee|275fccab7935736ff68c95c3ddbfaaee
使用 cookie 取得使用者身份,設定session
把所有非靜態資源的請求都導向到這裡處理。取得cookie,把cookie拆分並在資料庫中尋找符合條件的使用者。最後使用 next 跳到下一個請求邏輯。
下一個請求邏輯就可是直接使用 req.session.user 來取得 user 物件了。
session:function(req, res, next){ req.session = {}; if( req.cookies && req.cookies.sid ){ var a = req.cookies.sid.split("|"); var hexMail = a[0]; var hexPwd = a[1]; var hexRandom = a[2]; UserModel.hexFind(hexMail, hexPwd, hexRandom, function( status ){ //console.log("hexFind", status ); if(status.code == "0"){ //req.cookiesSelecter = cookiesSelecter; req.session.user = status.result; } next(); }); }else{ next(); } }
下面跟大家說說nodejs透過session實現驗證
nodejs express session 驗證
1)引入模組
var session = require('express-session'); var cookieParser = require('cookie-parser');
2)應用cookie及session
app.use(cookieParser()); app.use(session({ resave: true, // don't save session if unmodified saveUninitialized: false, // don't create session until something stored secret: 'love' }));
3)請求時,應用身份驗證
app.use(function(req,res,next){ if (!req.session.user) { if(req.url=="/login"){ next();//如果请求的地址是登录则通过,进行下一个请求 } else { res.redirect('/login'); } } else if (req.session.user) { next(); } });
4)登陸設計
app.get('/login',function(req,res){ res.render("login"); }); app.post('/login',function(req,res){ if(req.body.username=="love" && req.body.password=="love"){ var user = {'username':'love'}; req.session.user = user; res.redirect('/admin/app/list'); } else { res.redirect('/login'); } }); app.get('/logout',function(req,res){ req.session.user = null; res.redirect('/login'); });