是否可以通过sessionID获得快速会话?

时间:2015-04-03 01:38:04

标签: javascript node.js express express-session

我有一个使用快速会话的NodeJS Express应用程序。只要支持会话cookie,这就很有效。

不幸的是,它还需要使用不支持任何类型的Cookie的PhoneGap应用程序。

我想知道:是否有可能使用sessionID获得快速会话并访问该会话中的数据?

我想我可以将sessionID附加为PhoneGap应用发送的每个请求的查询字符串参数,如下所示:

https://endpoint.com/dostuff?sessionID=whatever

但我不知道怎么告诉express来检索会话。

2 个答案:

答案 0 :(得分:0)

您当然可以创建一个快速路由/中间件来欺骗express-session传入请求包含会话cookie。在会话中间件之前放置类似的内容:

app.use(function getSessionViaQuerystring(req, res, next) {
  var sessionId = req.query.sessionId;
  if (!sessionId) return res.send(401); // Or whatever

  // Trick the session middleware that you have the cookie;
  // Make sure you configure the cookie name, and set 'secure' to false
  // in https://github.com/expressjs/session#cookie-options
  req.cookies['connect.sid'] = req.query.sessionId;
  next();
});

答案 1 :(得分:0)

在我的案例中似乎无法访问req.cookies。这是另一个使用'x-connect.sid'标题重新创建会话的解决方案(如果愿意,您可以使用任何名称甚至查询参数)。

将此中间件置于会话中间件

之后

// FIRST you set up your default session like: app.use(session(options));

// THEN you recreate it using your/custom session ID
app.use(function(req, res, next){
	var sessionId = req.header('x-connect.sid');

	function makeNew(next){
    if (req.sessionStore){
      req.sessionStore.get(sessionId, function(err, session){
        if (err){
          console.error("error while restoring a session by id", err);
        }
        if (session){
          req.sessionStore.createSession(req, session);
        }
        next();
      });
    } else {
      console.error("req.sessionStore isn't available");
      next();
    }
	}

	if (sessionId) {
		if (req.session){
			req.session.destroy(function(err){
				if (err) {
					console.error('error while destroying initial session', err);
				}
				makeNew(next);
			});
		} else {
			makeNew(next);
		}
	} else {
		next();
	}
});