在nodejs項目中對于一些認證需要用到session,例如我寫的nodejs 聊天室的demo,就是通過session實現的認證。當存在session,直接進入聊天室,而不會重新登錄。
在網上也找到不少關于Express框架中的session調用方法,可是發現真正能用的不是很多,今天根據聊天室的制作過程,整理下Express和socket.IO中使用session的具體方法。
Express的session是通過cookie實現的,用到了connect中的兩個module:parseCookie和MemoryStore,前者是用來解析cookie,后者用來存儲sesion。
Express框架中使用session必須先引入上面的兩個模塊,例如下面的代碼:
var parseCookie = require('connect').utils.parseCookie, MemoryStore = require('connect/middleware/session/memory');//建立一個memory store的實例var storeMemory = new MemoryStore({ reapInterval: 60000 * 10 });
在app需要添加如下的配置:
app.configure(function(){ app.use(express.bodyParser());//解析post app.use(express.cookieParser());//解析cookie //設置session app.use(express.session({ secret: 'wyq', store:storeMemory }));});
在請求中我們可以使用request.session來調用session,例如下面的代碼:
app.get('/',function(req,res){ //使用request.session來判斷是否登錄 if( req.session.name && req.session.name!==''){ //需要判斷下是否已經登錄 res.redirect('/chat'); }else{ //讀取登錄頁面,要求登錄 var realpath = __dirname + '/views/' + url.parse('login.html').pathname; var txt = fs.readFileSync(realpath); res.end(txt); }});
在nodejs項目中,我們常常使用websockt來實現通信,所以websocket中也需要通過session來認證用戶。本例使用socket.io來舉例實現nodejs中websocket通信session的認證。關于socket.io的使用參考文章《使用socket.io和node.js搭建websocket應用》
上面代碼中引入了解析cookie的parseCookie,所以session是通過cookie來解析的。首先我們建立了socket的監聽之后需要對監聽到的頭文件處理,解析出來cookie中的session。例如下面的代碼:
var io = sio.listen(app);//設置sessionio.set('authorization', function(handshakeData, callback){ // 通過客戶端的cookie字符串來獲取其session數據 handshakeData.cookie = parseCookie(handshakeData.headers.cookie) var connect_sid = handshakeData.cookie['connect.sid']; if (connect_sid) { storeMemory.get(connect_sid, function(error, session){ if (error) { // if we cannot grab a session, turn down the connection callback(error.message, false); } else { // save the session data and accept the connection handshakeData.session = session; callback(null, true); } }); } else { callback('nosession'); }});
這樣我們就可以在socket監聽中使用session了,例如下面的代碼:
io.sockets.on('connection', function (socket){ var session = socket.handshake.session;//session var name = session.name; console.log(name); socket.broadcast.emit('system message', '【'+name + '】回來了,大家趕緊去找TA聊聊~~'); });
關于connect中middleware的session詳細介紹及其方法可以參考下面的官方介紹
最后附上前幾日寫的nodejs的一個聊天室,結合最近寫的文章,看起來應該很容易,里面的代碼相對簡單,注釋還算清晰,對于nodejs的初學者應該有一定的幫助:
下載基于express+socket.io的聊天室