2012-01-19 15 views
8

मैं सत्र डेटा प्राप्त करने के लिए सॉकेट.आईओ के प्रमाणीकरण फ़ंक्शन का उपयोग करने का प्रयास कर रहा हूं। समस्या यह है कि अगर मैं अपने सत्र को लॉग आउट और नष्ट कर देता हूं, तो सॉकेट.आईओ में अभी भी पुरानी सत्र जानकारी है, जो स्पष्ट रूप से आदर्श नहीं है। कोई भी विचार जो मैं नीचे दिए गए कोड में गलत कर रहा हूं?सॉकेट.ओ प्रमाणीकरण फ़ंक्शन सत्र डेटा अपडेट नहीं कर रहा है

io.sockets.on('connection', function(socket) { 

    var hs = socket.handshake; 
    console.log('A socket with sessionID ' + hs.sessionID 
     + ' connected!'); 
    // setup an inteval that will keep our session fresh 
    var intervalID = setInterval(function() { 
     // reload the session (just in case something changed, 
     // we don't want to override anything, but the age) 
     // reloading will also ensure we keep an up2date copy 
     // of the session with our connection. 
     hs.session.reload(function() { 
      // "touch" it (resetting maxAge and lastAccess) 
      // and save it back again. 
      hs.session.touch().save(); 
     }); 
    }, 60 * 1000); 
    socket.on('disconnect', function() { 
     console.log('A socket with sessionID ' + hs.sessionID 
      + ' disconnected!'); 
     // clear the socket interval to stop refreshing the session 
     clearInterval(intervalID); 
    }); 
}); 
+0

+1 मुझे एक ही समस्या है। यहां तक ​​कि यदि ग्राहक की सत्र कुकी समाप्त हो जाती है या हटा दी जाती है, तो सॉकेट.आईओ कनेक्शन के पास अभी भी पुराने डेटा तक पहुंच है और मानना ​​है कि सत्र अभी भी सक्रिय है। – dbau

उत्तर

4

से http://www.danielbaulig.de/socket-ioexpress/

sio.sockets.on('connection', function (socket) { 
    var hs = socket.handshake; 
    console.log('A socket with sessionID ' + hs.sessionID 
     + ' connected!'); 
    // setup an inteval that will keep our session fresh 
    var intervalID = setInterval(function() { 
     // reload the session (just in case something changed, 
     // we don't want to override anything, but the age) 
     // reloading will also ensure we keep an up2date copy 
     // of the session with our connection. 
     hs.session.reload(function() { 
      // "touch" it (resetting maxAge and lastAccess) 
      // and save it back again. 
      hs.session.touch().save(); 
     }); 
    }, 60 * 1000); 
    socket.on('disconnect', function() { 
     console.log('A socket with sessionID ' + hs.sessionID 
      + ' disconnected!'); 
     // clear the socket interval to stop refreshing the session 
     clearInterval(intervalID); 
    }); 

}); 

संपादित करें::

io.set('authorization', function (data, accept) { 
    if(data.headers.cookie) { 
     data.cookie = parseCookie(data.headers.cookie); 
     data.sessionID = data.cookie['express.sid']; 
     app.set('mongo-store').get(data.sessionID, function (err, session) { 
      console.log(err, session); 
     if (err || !session) { 
       // if we cannot grab a session, turn down the connection 
       accept('Error', false); 
     } else { 
     // save the session data and accept the connection 
     data.session = session; 
     accept(null, true); 
     } 
     }); 
    } else { 
     return accept('No cookie transmitted.', false); 
    } 
    accept(null, true); 
}); 

और यहाँ कनेक्शन कोड है प्रमाणन कोड

io.set('authorization', function (handshakeData, callback) { 
    var cookie; 
    // console.log(handshakeData.headers); 
    if (handshakeData.headers && handshakeData.headers.cookie) { 
    cookie = parseCookie(handshakeData.headers.cookie); 
    // where SessionStore is an instance of your mongo store 
    SessionStore.load(cookie['sioapp.sid'], function (err, session) { 
     if (err) { 
     // if we cannot grab a session, turn down the connection 
     console.log(err); 
     } else { 
     // console.log('Successfully decoded the session: ', session); 
     handshakeData.session = session; 
     } 
    }); 
    } 
    callback(null, true); // error first callback style 
}); 

एक बार हर 60 सेकंड, सत्र को छुआ है (इस प्रकार ताज़ा करें ईडी)। जब उपयोगकर्ता डिस्कनेक्ट हो जाता है, सत्र नष्ट हो जाता है।

+0

हम दोनों एक ही लेख से कोड का उपयोग कर रहे हैं। मैं पेज को और अधिक पाया गया प्राधिकरण कोड का उपयोग कर रहा हूं, लेकिन मेरी समस्या यह है कि मेरा 'sessionID' (जैसा कि' hs.sessionID' में उपयोग किया जाता है) या तो सही नहीं है या सॉकेट सत्र और एक्सप्रेस 'सत्र स्टोर के बीच संबंध बस है उम्मीद के रूप में काम नहीं कर रहा है। –

+0

अपना पूरा कोड पेस्ट करें, शायद आपके पास एक टाइपो है। – alessioalex

+0

मैंने अपने सभी कोड के साथ अपडेट किया। –

0

मुझे यकीन नहीं है कि 60 * 1000 का मतलब 60 एमएन है। मैं कहूंगा कि यह 1 एमएन है।

+0

यह मिलीसेकंड है। 1000 एमएस * 60 60 सेकंड है। –

संबंधित मुद्दे