为了账号安全,请及时绑定邮箱和手机立即绑定

如何与Socket.IO1.x和Express 4.x共享会话?

如何与Socket.IO1.x和Express 4.x共享会话?

幕布斯6054654 2019-07-15 10:14:03
如何与Socket.IO1.x和Express 4.x共享会话?如何与Socket.io 1.0和Express 4.x共享会话?我使用Redis商店,但我相信这不重要。我知道我必须使用中间件来查看cookie和获取会话,但不知道如何使用。我找了找,却找不到工作。    var RedisStore = connectRedis(expressSession);     var session = expressSession({         store: new RedisStore({             client: redisClient        }),         secret: mysecret,         saveUninitialized: true,         resave: true     });     app.use(session);     io.use(function(socket, next) {         var handshake = socket.handshake;         if (handshake.headers.cookie) {             var str = handshake.headers.cookie;             next();         } else {             next(new Error('Missing Cookies'));         }     });
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

就在一个半月前,我处理了同样的问题,后来写了一篇广泛的文章。博客帖子在这个问题上,它与一个充分发挥作用的问题结合在一起演示应用程序托管在GitHub上。解决方案依赖于特快会议cookie解析器连红节点模块来连接所有的东西。它允许您访问和修改来自REST和Socket上下文的会话,这是非常有用的。

中间件设置是两个关键部分:

app.use(cookieParser(config.sessionSecret));app.use(session({
    store: redisStore,
    key: config.sessionCookieKey,
    secret: config.sessionSecret,
    resave: true,
    saveUninitialized: true}));

.和SocketIO服务器设置:

ioServer.use(function (socket, next) {
    var parseCookie = cookieParser(config.sessionSecret);
    var handshake = socket.request;

    parseCookie(handshake, null, function (err, data) {
        sessionService.get(handshake, function (err, session) {
            if (err)
                next(new Error(err.message));
            if (!session)
                next(new Error("Not authorized"));

            handshake.session = session;
            next();
        });
    });});

它们与我创建的一个简单的sessionService模块一起使用,它允许您对会话执行一些基本操作,代码如下所示:

var config = require('../config');var redisClient = null;var redisStore = null;var self = module.exports = {
    initializeRedis: function (client, store) {
        redisClient = client;
        redisStore = store;
    },
    getSessionId: function (handshake) {
        return handshake.signedCookies[config.sessionCookieKey];
    },
    get: function (handshake, callback) {
        var sessionId = self.getSessionId(handshake);

        self.getSessionBySessionID(sessionId, function (err, session) {
            if (err) callback(err);
            if (callback != undefined)
                callback(null, session);
        });
    },
    getSessionBySessionID: function (sessionId, callback) {
        redisStore.load(sessionId, function (err, session) {
            if (err) callback(err);
            if (callback != undefined)
                callback(null, session);
        });
    },
    getUserName: function (handshake, callback) {
        self.get(handshake, function (err, session) {
            if (err) callback(err);
            if (session)
                callback(null, session.userName);
            else
                callback(null);
        });
    },
    updateSession: function (session, callback) {
        try {
            session.reload(function () {
                session.touch().save();
                callback(null, session);
            });
        }
        catch (err) {
            callback(err);
        }
    },
    setSessionProperty: function (session, propertyName, propertyValue, callback) {
        session[propertyName] = propertyValue;
        self.updateSession(session, callback);
    }};

因为整个过程中有更多的代码(比如初始化模块,在客户机和服务器端使用套接字和REST调用),所以我不会在这里粘贴所有的代码,您可以在GitHub上查看它,您可以使用它做任何事。


查看完整回答
反对 回复 2019-07-15
  • 3 回答
  • 0 关注
  • 599 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信