【问题标题】:Grabbing existing session on page reload with express/connect-redis使用 express/connect-redis 在页面重新加载时获取现有会话
【发布时间】:2012-03-28 11:34:22
【问题描述】:

使用 connect、express 和 socket.io,我试图让我的应用程序在重新连接时获取会话详细信息。我的会话在客户端连接时显然有效,但如果我在浏览器上刷新页面,它会忘记所有内容。
我的会话cookie肯定是一样的,所以不是那样的。

我的代码是我从许多不同来源获取的 sn-ps 的大杂烩,因为那里似乎没有一个完整的示例应用程序。 :-/

我错过了什么..?

var qs      = require('querystring'),
    express = require('express'),
    app     = express.createServer(),
    io      = require('socket.io').listen(app.listen(8000)),
    routes  = require('./routes'),
    pCookie = require('connect').utils.parseCookie,
    Session = require('connect').middleware.session.Session,
    RedStore= require('connect-redis')(express),
    sStore  = new RedStore();

// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'ejs');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser());
  app.use(express.session({ store: sStore, secret: 'tehsecretz' }));
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function(){
  app.use(express.errorHandler());
});

// Routes

app.get('/', routes.index);

io.sockets.on('connection', function (client) {
    var hs = client.handshake,
        session = hs.session;

    console.log('A socket connected called: ' + hs.sessionId);

    var intervalId = setInterval(function() {
        hs.session.reload(function() {
            hs.session.touch().save();
        });
    }, 60 * 1000);

    if (!session.userName) {
        // Prompts the user for a name on the frontend
        client.emit('need-to-register');
    }

    client.on('message', function(msg, c) {
        console.log(session);
        console.log(msg);
    });

    client.on('register-user', function(data, fn) {
        // This retrieves the user's name
        // and - hopefully - saves it to the session.

        data = qs.parse(data);
        session.userName = data.username;

        hs.session.save();
        console.log('Saving: ', session);

        fn('ok');
    });

    client.on('disconnect', function() {
        clearInterval(intervalId);
    });
});

io.set('authorization', function (data, accept) {
    if (data.headers.cookie) {
        data.cookie = pCookie(data.headers.cookie);
        data.sessionId = data.cookie['connect.sid'];

        data.sessionStore = sStore;
        sStore.get(data.sessionId, function (err, session) {
            if (err || !session) {
                accept('Error', false);
            } else {
                console.log(data.sessionId, session);
                data.session = new Session(data, session);
                accept(null, true);
            }
        });
    } else {
        return accept('No cookie transmitted', false);
    }
});

感谢您提供的任何帮助!

【问题讨论】:

  • 简单的回答是Socket.IO不是connect的,bodyParser只作用于connect请求。 Socket.IO 有不同的传输,它们不共享 cookie,因此它必须使用其中一种 HTTP 传输,并且您需要 Socket.IO 的中间件,它可以合并会话 cookie 以进行连接,或使用连接会话用于检索会话的 API。
  • 但是sStoreconnect-redis 的一个实例,那么authorization 方法中的sStore.get() 不是处理这个问题的方法吗?就像我说的那样,cookie 根本没有变化。在我的脑海中,我会认为更新会话(来自client.on('register-user'...))会将其写入redis,因此在检索时可由cookie使用。 ....除非我错过了一些基本的东西,当然。

标签: node.js express socket.io connect


【解决方案1】:

在“express.session”中添加“cookie”

app.use(express.session({
    secret: 'exampleSecretKey'
    ,store: exampleStore
    ,key: 'example'
    cookie: {
        path: '/'
        ,expires: false // Alive Until Browser Exits
        ,httpOnly: true
    //  ,domain:'.example.com'
    }
});

【讨论】:

  • 感谢您的回复,但这没有任何效果。
【解决方案2】:

呃。所以在Daniel Baulig's post 的主题中,他引用了标识符sessionID。我认为这只是一种糟糕的约定(因为我习惯了 camelCase),并立即在我的代码中将其更改为 sessionId

在调试时,我在我的 redis 实例上打开了 MONITORing 并注意到会话正在写入 sess:undefined

原来sessionID 是特殊的并且在内部被引用为实际标识符。将sessionId 的所有实例更改为sessionID 可以让我更好地了解谁在连接!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多