express session 和 socketio session关联
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-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.
使用 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了
- sio.use(function(socket, next) {
- sessionMiddleware(socket.request, socket.request.res, next);
- });
example:
- var Server = require("http").Server;
- var session = require("express-session");
- var app = express();
- var server = Server(app);
- var sio = require("socket.io")(server);
- var sessionMiddleware = session({
- secret: "keyboard cat",
- resave: false,
- saveUninitialized: true
- });
- sio.use(function(socket, next) {
- sessionMiddleware(socket.request, socket.request.res, next);
- });
- app.use(sessionMiddleware);
- app.get("/", function(req, res){
- req.session.username = 'jim';
- });
- sio.sockets.on("connection", function(socket) {
- console.log(socket.request.session.username); // 'jim'
- });
- server.listen(80);
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.sessionyou 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:truein 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关联的更多相关文章
- express前后的分离session的使用
express前后端分离session的使用 1.后端app.js中增加 app.all('*', function(req, res, next) { res.header("Access ...
- [原理][来源解析]spring于@Transactional,Propagation.SUPPORTS,以及 Hibernate Session,以及jdbc Connection关联
Spring 捆绑Hibernate. 夹: 一. 1. Spring 怎样处理propagation=Propagation.SUPPORTS? 2. Spring 何时生成HibernateSe ...
- Hibernate中session.get()和session.load()的区别
-- 翻译自https://www.mkyong.com/hibernate/different-between-session-get-and-session-load/ 很多时候你会发现,使用Hi ...
- cookie和session的区别,session的生命周期,
这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...
- [原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
- 【荐】PHP Session和Cookie,Session阻塞,Session垃圾回收,Redis共享Session,不推荐Memcached保存Session
什么是 Session 在 web 应用开发中,Session 被称为会话.主要被用于保存某个访问者的数据. 由于 HTTP 无状态的特点,服务端是不会记住客户端的,对服务端来说,每一个请求都是全新的 ...
- 报表session与应用session常识普及
1. 报表session与应用session 报表集成到项目中可能会有一个疑问就是系统应用和报表应用在一个web服务器下,那系统session和报表session是不是一个session呢?如果不是那 ...
- 使用Memcached Session Manager扩展Session管理
>>Tomcat的session管理 在请求过程中首先要解析请求中的sessionId信息,然后将sessionId存储到request的参数列表中. 然后再从request获取sessi ...
随机推荐
- spark als scala实现(二)
Vi t1.txt1,101,5.01,102,3.01,103,2.52,101,2.02,102,2.52,103,5.02,104,2.03,101,2.53,104,4.03,105,4.5 ...
- Linux(Manjaro) -Docker 安装及基本配置
Linux(Manjaro) -Docker 安装及基本配置 基本安装 # Pacman 安装 Docker sudo pacman -S docker # 启动docker服务 sudo syste ...
- maven项目更换本地仓库
由于电脑重装系统更换原来maven项目的本地仓库 以前的仓库位置如图 需要更换的仓库位置 更换步骤如下: 更换后:
- SpringBoot使用qq邮箱发送邮件
最近公司要做一个邮箱注册和重置密码的功能,因为之前就做过,但是不是Springboot项目,所以相对来说还是比较容易的,在这里记录一下. 一.引用Maven依赖 这里使用spring自带的邮件jar包 ...
- Codeforces #548 (Div2) - D.Steps to One(概率dp+数论)
Problem Codeforces #548 (Div2) - D.Steps to One Time Limit: 2000 mSec Problem Description Input Th ...
- ASP.NET MVC 自定义模型绑定1 - 自动把以英文逗号分隔的 ID 字符串绑定成 List<int>
直接贴代码了: CommaSeparatedModelBinder.cs using System; using System.Collections; using System.Collection ...
- Linux新手随手笔记1.3
shell脚本的编写(划重点) #!/bin/bash 脚本的声明信息 #sjsjdhsjdhh 脚本的注释 ls -l ...
- 对var的新笔记
今天看阮老师的ES6入门时,看见一个对我来说从没想到过的var赋值变量导致的错误,故记录一下 var tmp = new Date(); function f() { console.log(tmp) ...
- 关于vue生命周期
官网给出的实例的生命周期图如下: beforeCreate(页面创建前),created(页面创建后),beforeMount(页面载入前),mounted(页面载入后),beforeUpdate(页 ...
- POJ1847 Tram
Tram Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 20274 Accepted: 7553 Description ...