http是沒有狀態的協議, 須要web框架本身實現會話和會話管理工做。node
express框架有session插件能夠使用。git
見以下介紹:github
https://www.tutorialspoint.com/expressjs/expressjs_sessions.htmweb
We will need the Express-session, so install it using the following code.express
npm install --save express-sessionWe will put the session and cookie-parser middleware in place. In this example, we will use the default store for storing sessions, i.e., MemoryStore. Never use this in production environments. The session middleware handles all things for us, i.e., creating the session, setting the session cookie and creating the session object in req object.npm
使用 session 和 cookie-parser中間件能夠實現, 在req對象上回關聯session對象。cookie
var express = require('express'); var cookieParser = require('cookie-parser'); var session = require('express-session'); var app = express(); app.use(cookieParser()); app.use(session({secret: "Shh, its a secret!"})); app.get('/', function(req, res){ if(req.session.page_views){ req.session.page_views++; res.send("You visited this page " + req.session.page_views + " times"); } else { req.session.page_views = 1; res.send("Welcome to this page for the first time!"); } }); app.listen(3000);
socketio對於如今實時數據推送很是友好, 在不少網站上被使用。session
如何在socketio connection上關聯上對應的session, 此session爲 express session建立, express建立後, 在處理的handler中, 入參數 req.session 能夠獲取會話。app
在socketio鏈接上如何獲取會話呢?框架
解決方案見下面連接:
https://github.com/wcamarao/session.socket.io/blob/master/example/server.js
ar http = require('http') , path = require('path') , connect = require('connect') , express = require('express') , app = express(); var cookieParser = express.cookieParser('your secret sauce') , sessionStore = new connect.middleware.session.MemoryStore(); app.configure(function () { app.set('views', path.resolve('views')); app.set('view engine', 'jade'); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(cookieParser); app.use(express.session({ secret: 'your secret sauce', store: sessionStore })); app.use(app.router); }); var server = http.createServer(app) , io = require('socket.io').listen(server); var SessionSockets = require('session.socket.io') , sessionSockets = new SessionSockets(io, sessionStore, cookieParser); app.get('/', function(req, res) { req.session.foo = req.session.foo || 'bar'; res.render('index'); }); sessionSockets.on('connection', function (err, socket, session) { socket.emit('session', session); socket.on('foo', function(value) { session.foo = value; session.save(); socket.emit('session', session); }); }); server.listen(3000);
https://blog.csdn.net/u012251421/article/details/76207034
express 4.x能夠直接把express-session中間件當成socket.io處理,因此能夠簡單像下面這樣,就能夠共享express的session了
example:
https://www.npmjs.com/package/express-socket.io-session
After every socket connection, you'll have socket.handshake.session. That is the same session object
req.session
you get in your route middleware when your app uses express-session.
Modifying session data inside socket.io event handlers
When inside express, you normally get to modify your session variables trusting that express-session saves them for you.
Invoke this module with an option of
autoSave:true
in order for achieveing the same behaviour.io
var app = require('express')(), server = require("http").createServer(app), io = require("socket.io")(server), session = require("express-session")({ secret: "my-secret", resave: true, saveUninitialized: true }), sharedsession = require("express-socket.io-session"); // Attach session app.use(session); // Share session with io sockets io.use(sharedsession(session)); io.on("connection", function(socket) { // Accept a login event with user's data socket.on("login", function(userdata) { socket.handshake.session.userdata = userdata; socket.handshake.session.save(); }); socket.on("logout", function(userdata) { if (socket.handshake.session.userdata) { delete socket.handshake.session.userdata; socket.handshake.session.save(); } }); }); server.listen(3000);
https://cnodejs.org/topic/516517a56d38277306c614da