首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >既然connect不再使用parseCookie方法,那么如何使用express获取会话数据呢?

既然connect不再使用parseCookie方法,那么如何使用express获取会话数据呢?
EN

Stack Overflow用户
提问于 2012-10-09 13:21:41
回答 4查看 5.5K关注 0票数 13

在node.js和express中,有许多示例演示如何获取会话数据。

正如您在访问第三个链接时所看到的,这是一个指向StackOverflow的链接。有一个很好的答案,但正如@UpTheCreek在这些评论中所指出的,connect已经没有parseCookie方法了。我也遇到了这个问题。我发现的所有教程都使用了connect的parseCookie方法,现在还不存在。所以我问他如何获得会话数据,他说他不知道最好的方法,所以我想我应该在这里发布这个问题。当使用express@3.0.0rc4socket.ioredis时,我们如何获得会话数据并使用它来授权用户?我已经可以使用require('connect').utils.parseSignedCookie;了,但是当我这样做的时候,当我握手时总是会收到警告/错误,

代码语言:javascript
复制
warn - handshake error Error

据我所知,这听起来并不是一个永久性的解决方案。

更新

好的,我让session.socket.io在我的服务器上工作。就像我怀疑的那样,我被困在了授权点上。我想我可能走错路了,所以请随时纠正我。在我的Redis数据库中,我将获得用户的信息。他们第一次登录时,我想更新他们的cookie,这样它就包含了他们的用户信息。然后,下一次他们回到网站,我想检查他们是否有一个cookie和用户信息在那里。如果它不在那里,我想把它们发送到登录屏幕。在登录屏幕上,当用户提交信息时,它将根据Redis数据库测试该信息,如果匹配,它将使用用户信息更新cookie。我的问题是:

1)如何通过RedisStore更新/更改cookie?

2)看起来会话数据只保存在cookies中。如果有人关闭了cookie,我如何在页面和页面之间跟踪用户信息?

以下是我的适用代码:

代码语言:javascript
复制
//...hiding unapplicable code...
var redis = require('socket.io/node_modules/redis');
var client = redis.createClient();
var RedisStore = require('connect-redis')(express);
var redis_store = new RedisStore();
var cookieParser = express.cookieParser('secret');

app.configure(function(){
  //...hiding unapplicable code...
  app.use(cookieParser);
  app.use(express.session({secret: 'secret', store: redis_store}));
});

//...hiding code that starts the server and socket.io

var SessionSockets = require('session.socket.io');
var ssockets = new SessionSockets(io, redis_store, cookieParser);

io.configure(function(){
  io.set('authorization', function(handshake, callback){
    if(handshake.headers.cookie){
      //var cookie = parseCookie(handshake.headers.cookie);
      //if(cookie.user){
      //  handshake.user = cookie.user;
      //}
    }
    callback(null, true);
  });
});

ssockets.on('connection', function(err, socket, session){ ... });
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-27 21:29:50

切换到session.socket.io一段时间后,由于加载会话信息时模块的异步性质,我遇到了一些问题。因此,我最终创建了自己的模块session.io。它是这样使用的:

代码语言:javascript
复制
var express = require('express');
var app = express();
var server = require('http').createServer(app);

//Setup cookie and session handlers
//Note: for sessionStore you can use any sessionStore module that has the .load() function
//but I personally use the module 'sessionstore' to handle my sessionStores.
var cookieParser = express.cookieParser('secret');
var sessionStore = require('sessionstore').createSessionStore();

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  //...truncate...//
  app.use(cookieParser);
  //make sure to use the same secret as you specified in your cookieParser
  app.use(express.session({secret: 'secret', store: sessionStore}));
  app.use(app.router);
});

app.get('/', function(req, res){
  res.send('<script src="/socket.io/socket.io.js"></script><script>io.connect();</script>Connected');
});

server.listen(app.get('port'), function(){
  console.log('Listening on port ' + app.get('port'));
});

var io = require('socket.io').listen(server);

io.configure(function(){
  //use session.io to get our session data
  io.set('authorization', require('session.io')(cookieParser, sessionStore));
});

io.on('connection', function(socket){
  //we now have access to our session data like so
  var session = socket.handshake.session;
  console.log(session);
});
票数 4
EN

Stack Overflow用户

发布于 2012-10-11 14:27:35

看看Socket.IO的维基。特别是零件配置Socket.IO授权与握手

它展示了如何将socket.io与RedisStore一起使用,并给出了两种不同的授权方法。

有关连接速递v3、redis和socket.io的更多信息

票数 6
EN

Stack Overflow用户

发布于 2012-10-16 21:11:51

你的问题:

  1. 如何通过RedisStore更新/更改cookie?
  2. 看起来会话数据只保存在cookie中。如果有人关闭了cookie,我如何从一个页面到另一个页面跟踪用户信息?

Cookie/Session/ RedisStore思考:

  1. 通常,只有一个cookie,即会话id。
  2. 所有用户状态都存储在服务器上的“会话”中,该会话可以通过会话id找到。
  3. 您可以使用Redis作为会话数据的后端存储。
  4. Redis将允许您保持会话状态,即使您的服务器重新启动(好事情)。
  5. 您可以在会话中存储大量数据(req.session.key = value)
  6. 存储在会话中的所有数据将一直保持到用户注销或其会话到期为止。

示例node.js代码:

代码语言:javascript
复制
var app = express.createServer(
  express.static(__dirname + '/public', { maxAge: 31557600000 }),
  express.cookieParser(),
    express.session({ secret: 'secret', store: new RedisStore({
          host: 'myredishost',
          port: 'port',
          pass: 'myredispass',
          db: 'dbname',
      }, cookie: { maxAge: 600000 })})
);

会话和Cookie的想法:

  1. 你的第二个问题是关于没有饼干的会议。这是可能的。
  2. 基本上,您将会话id放在发送到服务器的每个请求的url上。
  3. 我坚信大多数人都允许吃饼干。
  4. 如果这是一个要求,google:“无曲奇会话”
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12801027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档