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 ...
随机推荐
- selenium-webdriver的二次封装(十)
接着上篇随笔 selenium-配置文件定位元素 ,进行了配置文件设置后,将配置文件运用到定位元素中 思路:拿到定位的 key 和 value 后,对 webdrvier 中定位进行封装,使可以直接运 ...
- 解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile
原因: 由于项目所需jdk版本和你当前使用的jdk版本不一致导致的,因为我项目的pom.xml中定义了java版本为1.8,但是我实际idea中run这个项目却是1.7 解决方案: 更换当前jdk版本 ...
- WebApi 身份认证解决方案:Basic基础认证
前言:最近,讨论到数据库安全的问题,于是就引出了WebApi服务没有加任何验证的问题.也就是说,任何人只要知道了接口的url,都能够模拟http请求去访问我们的服务接口,从而去增删改查数据库,这后果想 ...
- PIC单片机基础1
1.PIC单片机总线结构——哈佛结构:即指令和数据空间是完全分开的,所以与常见的微控制器不同的一点是,程序和数据总线可以采用不同的宽度.以PIC16F684单片机为例,数据总线是8位的,但指令总线位数 ...
- Linux学习之路(三)Shell脚本初探
本文参考链接:http://www.runoob.com/linux/linux-shell.html 基本说明 Shell脚本(shell script)是一种为shell编写的脚本程序.其中she ...
- 一键安装Cloud Torrent
wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/cloudt.sh ...
- Winform开发中对界面的组织布局
在设计界面的时候,不管是在Web端,还是在Winform端,或者是WPF或者移动界面等应用上,我们对界面的组织布局,一直是比较有趣的话题,而组织界面的好坏从用户的感受来看,可以提供程序可使用性高低,也 ...
- 是时候理解下HTTPS的原理及流程了
1.什么是HTTP协议? HTTP协议是Hyper Text Transfer Protocol(超文本传输协议),位于TCP/IP模型当中的应用层.HTTP协议通过请求/响应的方式,在客户端和服务端 ...
- 记录一次无厘头的粗心失误——java后台报错:Unknown column 'xxx' in 'field list'
原因: sql文件马虎,直接用错了仓库.用的不是程序调用的仓库.而自己pojo和mapper还是采用Mybatis的逆向工程生成的.当时搞得很无厘头. 解决方案: sql用到程序指定的仓库就行啦. 总 ...
- MySQL select into outfile 和 load data infile数据跨库转移
select into outfile用法 SELECT ... FROM TABLE_A INTO OUTFILE "/path/to/file" FIELDS TERMINAT ...