express session

http是没有状态的协议, 需要web框架自己实现会话和会话管理工作。

express框架有session插件可以使用。

见如下介绍:

https://www.tutorialspoint.com/expressjs/expressjs_sessions.htm

We will need the Express-session, so install it using the following code.

npm install --save express-session

We 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.

使用 session 和 cookie-parser中间件可以实现, 在req对象上回关联session对象。

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 connection session

socketio对于现在实时数据推送非常友好, 在很多网站上被使用。

如何在socketio connection上关联上对应的session, 此session为 express session创建, express创建后, 在处理的handler中, 入参数 req.session 可以获取会话。

在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);

express 4之上版本 express session天生支持

https://blog.csdn.net/u012251421/article/details/76207034

express 4.x可以直接把express-session中间件当成socket.io处理,所以可以简单像下面这样,就可以共享express的session了

  1. sio.use(function(socket, next) {
  2. sessionMiddleware(socket.request, socket.request.res, next);
  3. });

example:

  1. var Server = require("http").Server;
  2. var session = require("express-session");
  3.  
  4. var app = express();
  5. var server = Server(app);
  6. var sio = require("socket.io")(server);
  7.  
  8. var sessionMiddleware = session({
  9. secret: "keyboard cat",
  10. resave: false,
  11. saveUninitialized: true
  12. });
  13.  
  14. sio.use(function(socket, next) {
  15. sessionMiddleware(socket.request, socket.request.res, next);
  16. });
  17.  
  18. app.use(sessionMiddleware);
  19.  
  20. app.get("/", function(req, res){
  21. req.session.username = 'jim';
  22. });
  23.  
  24. sio.sockets.on("connection", function(socket) {
  25. console.log(socket.request.session.username); // 'jim'
  26. });
  27.  
  28. server.listen(80);
  29.  

express-socket.io-session

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.use(sharedsession(session, {
    autoSave:true
}));
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);

express登录例子:

https://cnodejs.org/topic/516517a56d38277306c614da

express session 和 socketio session关联的更多相关文章

  1. express前后的分离session的使用

    express前后端分离session的使用 1.后端app.js中增加 app.all('*', function(req, res, next) { res.header("Access ...

  2. [原理][来源解析]spring于@Transactional,Propagation.SUPPORTS,以及 Hibernate Session,以及jdbc Connection关联

    Spring 捆绑Hibernate. 夹: 一.  1. Spring 怎样处理propagation=Propagation.SUPPORTS? 2. Spring 何时生成HibernateSe ...

  3. Hibernate中session.get()和session.load()的区别

    -- 翻译自https://www.mkyong.com/hibernate/different-between-session-get-and-session-load/ 很多时候你会发现,使用Hi ...

  4. cookie和session的区别,session的生命周期,

    这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...

  5. [原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  6. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  7. 【荐】PHP Session和Cookie,Session阻塞,Session垃圾回收,Redis共享Session,不推荐Memcached保存Session

    什么是 Session 在 web 应用开发中,Session 被称为会话.主要被用于保存某个访问者的数据. 由于 HTTP 无状态的特点,服务端是不会记住客户端的,对服务端来说,每一个请求都是全新的 ...

  8. 报表session与应用session常识普及

    1. 报表session与应用session 报表集成到项目中可能会有一个疑问就是系统应用和报表应用在一个web服务器下,那系统session和报表session是不是一个session呢?如果不是那 ...

  9. 使用Memcached Session Manager扩展Session管理

    >>Tomcat的session管理 在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中. 然后再从request获取sessi ...

随机推荐

  1. jquery中Json操作

    在开发中,我们有可能拿到的不是全的json,而是一部分json格式的数据,这个时候我们需要将其强转为json对象 第一种方法:使用jquery中的$.parseJSON(),但是它对json数据格式的 ...

  2. C#类继承中构造函数的执行序列

    不知道大家在使用继承的过程中有木有遇到过调用构造函数时没有按照我们预期的那样执行呢?一般情况下,出现这样的问题往往是因为类继承结构中的某个基类没有被正确实例化,或者没有正确给基类构造函数提供信息,如果 ...

  3. ABP之启动配置

    ASP.NET Boilerplate提供了在StartUp中配置其模块的基础设施和模型. 配置ASP.NET Boilerplate 配置ABP是在模块的PreInitialize 方法中做的,如下 ...

  4. npm包--rimraf

    含义 rimraf 包的作用:以包的形式包装rm -rf命令,用来删除文件和文件夹的,不管文件夹是否为空,都可删除. 安装 npm install rimraf --save-dev 使用 const ...

  5. 我的Qt历程1:第一个Qt程序

    1.启动Qt,按照红圈内所标注顺序执行操作. 2.按下Choose键后,在“名称”栏目里给程序起名字(不要是汉字名字). 3.在“创建路径”栏目里指定程序将要使用的路径(不能用汉字路径). 4.在“类 ...

  6. Charles(V3.10.1)的抓包以及常见功能的使用

    一.Charles的安装 安装都不会,那就不用再往下看了.(*^__^*) 嘻嘻…… 二.HTTP抓包 1.查看电脑IP地址 2.设置手机的HTTP代理 手机连接到同一WiFi下设置HTTP代理: 服 ...

  7. java事件监听机制

    1.简单的事件监听 package demo2; /* * java事件监听机制 */ import java.awt.*; import javax.swing.*; import java.awt ...

  8. pycharm中运行时添加配置 及pytest模式怎么修改为run模式

    会发现不是控制台输出,而是pytest模式. 修改: 当运行时,发现无法运行: 然后点击Add Configuration, 点击加号,点击Python: 选择脚本路径和解释器.点击OK即可.

  9. [蓝桥杯]2015蓝桥省赛B组题目及详解

    /*——————————————————————————————————————————————————————————— [结果填空题]T1 题目:奖券数目 有些人很迷信数字,比如带“4”的数字,认 ...

  10. CodeForces 1151D Stas and the Queue at the Buffet

    题目链接:http://codeforces.com/contest/1151/problem/D 题目大意: 有n个学生排成一队(序号从1到n),每个学生有2个评定标准(a, b),设每个学生的位置 ...