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.

  1. 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对象。

  1. var express = require('express');
  2. var cookieParser = require('cookie-parser');
  3. var session = require('express-session');
  4.  
  5. var app = express();
  6.  
  7. app.use(cookieParser());
  8. app.use(session({secret: "Shh, its a secret!"}));
  9.  
  10. app.get('/', function(req, res){
  11. if(req.session.page_views){
  12. req.session.page_views++;
  13. res.send("You visited this page " + req.session.page_views + " times");
  14. } else {
  15. req.session.page_views = 1;
  16. res.send("Welcome to this page for the first time!");
  17. }
  18. });
  19. 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

  1. ar http = require('http')
  2. , path = require('path')
  3. , connect = require('connect')
  4. , express = require('express')
  5. , app = express();
  6.  
  7. var cookieParser = express.cookieParser('your secret sauce')
  8. , sessionStore = new connect.middleware.session.MemoryStore();
  9.  
  10. app.configure(function () {
  11. app.set('views', path.resolve('views'));
  12. app.set('view engine', 'jade');
  13.  
  14. app.use(express.bodyParser());
  15. app.use(express.methodOverride());
  16. app.use(cookieParser);
  17. app.use(express.session({ secret: 'your secret sauce', store: sessionStore }));
  18. app.use(app.router);
  19. });
  20.  
  21. var server = http.createServer(app)
  22. , io = require('socket.io').listen(server);
  23.  
  24. var SessionSockets = require('session.socket.io')
  25. , sessionSockets = new SessionSockets(io, sessionStore, cookieParser);
  26.  
  27. app.get('/', function(req, res) {
  28. req.session.foo = req.session.foo || 'bar';
  29. res.render('index');
  30. });
  31.  
  32. sessionSockets.on('connection', function (err, socket, session) {
  33. socket.emit('session', session);
  34.  
  35. socket.on('foo', function(value) {
  36. session.foo = value;
  37. session.save();
  38. socket.emit('session', session);
  39. });
  40. });
  41.  
  42. 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
}));
  1. var app = require('express')(),
  2. server = require("http").createServer(app),
  3. io = require("socket.io")(server),
  4. session = require("express-session")({
  5. secret: "my-secret",
  6. resave: true,
  7. saveUninitialized: true
  8. }),
  9. sharedsession = require("express-socket.io-session");
  10.  
  11. // Attach session
  12. app.use(session);
  13.  
  14. // Share session with io sockets
  15.  
  16. io.use(sharedsession(session));
  17.  
  18. io.on("connection", function(socket) {
  19. // Accept a login event with user's data
  20. socket.on("login", function(userdata) {
  21. socket.handshake.session.userdata = userdata;
  22. socket.handshake.session.save();
  23. });
  24. socket.on("logout", function(userdata) {
  25. if (socket.handshake.session.userdata) {
  26. delete socket.handshake.session.userdata;
  27. socket.handshake.session.save();
  28. }
  29. });
  30. });
  31.  
  32. 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. ZOJ 2480 - Simplest Task in Windows

    Simplest Task in Windows Time Limit: 2 Seconds      Memory Limit: 65536 KB A typical windows platfor ...

  2. Git源代码管理

    一. 分支管理 使用 git 进行源代码管理,一般将某个项目的所有分支分为以下几条主线 1. Master 顾名思义,既然名字叫 Master ,那么该分支就是主分支的意思. master 分支永远是 ...

  3. Microsoft Deployment Toolkit build 8456

    MDT build 8456的重大变化摘要. 支持的配置更新 Windows ADK for Windows 10,版本1809 Windows 10,版本1809 Configuration Man ...

  4. tensorflow的基本认识

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/10741013.html 作者:窗户 ...

  5. 搭建IIS并配置网站之旅

    配置本地IIS这个过程,很羞愧的说,大概花了一个月之久…… 最开始,有需要用到了IIS,然后就着手配置,然后就遇到了问题,然后当时事很多,这又不是很急,就搁置了…… 在历经了一个月之后,现在又空余时间 ...

  6. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

  7. centos6.5搭建hadoop完整教程

    https://blog.csdn.net/hanzl1/article/details/79040380 博客地址http://blog.csdn.net/pucao_cug/article/det ...

  8. idea 右键无java class选项

    项目中新建module之后,要在该目录下新增java Class文件,右键——>New发现无Java Class选项. File –Project Structure或者ctrl+alt+shi ...

  9. 【原创】平时的你VS面试的你

    引言 大家在面试的时候,特别是最后一面HR面,是不是经常都说自己咳咳咳.博主特意总结了一下平时的你和面试的你区别在哪,整理成文,大家看看就好~ 正文 面对HR 问题:你是如何和你同事相处的? 平时的你 ...

  10. vue路由传对象刷新会报错,数据丢失,用json字符串解决

    变成json字符串,且加密 this.$router.push({name: response.body.PowerList[0].opPowerurl ,query :{ all: encodeUR ...