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. Linux通过NFS实现文件共享

    在项目生产环境我们经常需要实现文件共享,传统的常见方案是通过NFS,实现服务器之间共享某一块磁盘,通过网络传输将分散的文件集中存储在一块指定的共享磁盘,实现基本的文件共享.实现这种方案,分服务端和客户 ...

  2. 获取DataTable前几条数据

    #region 获取DataTable前几条数据 /// <summary> /// 获取DataTable前几条数据 /// </summary> /// <param ...

  3. The xp_cmdshell proxy account information cannot be retrieved or is invalid. Verify that the '##xp_cmdshell_proxy_account##' credential exists and contains valid information.

    In one of our recent migrations, we got the following error when the client tried to fire xp_cmdshel ...

  4. c# 创建excel表头及内容

    主要通过ajax调用函数Getinfo 1.定义表dh DataTable dh = new DataTable(); 2.创建表头 public void CreateCol(string Colu ...

  5. Linux(Manjaro) - IntelliJ IDEA (JetBrains) 字体模糊解决方法

    Linux(Manjaro) - IntelliJ IDEA 字体模糊解决方法 解决方法非常简单, 只要安装 JetBrains 提供的 jre 即可 使用 Octopi 或者 pacman 安装名为 ...

  6. Mysql--alter命令小特点

    以下命令均在mysql命令行下执行.1. 修改表名称有2种方法,mysql命令行,没有区分大小写,方法1:mysql>ALTER TABLE 表名l RENAME TO 表名2; 方法2:mys ...

  7. 芒果绿的blog

    --------------------------------------------------------------这是芒果绿的blog!!-------------------------- ...

  8. 我的第一个python web开发框架(39)——后台接口权限访问控制处理

    前面的菜单.部门.职位与管理员管理功能完成后,接下来要处理的是将它们关联起来,根据职位管理中选定的权限控制菜单显示以及页面数据的访问和操作. 那么要怎么改造呢?我们可以通过用户的操作步骤来一步步进行处 ...

  9. angularjs html 转义

    angularjs html 转义 默认情况下,AngularJS对会对插值指令求职表达式(模型)中的任何HTML标记都进行转义,例如以下模型: $scope.msg = “hello,<b&g ...

  10. toast提示信息获取

    toast获取的前提条件 1.desired_caps["automationName"]="UiAutomator2"2.要求安装jdk1.8 64位及以上. ...