每次刷新或访问页面时,Node js express-session都会创建新的会话ID

Posted

技术标签:

【中文标题】每次刷新或访问页面时,Node js express-session都会创建新的会话ID【英文标题】:Node js express-session creating new session id every time I refresh or access the page 【发布时间】:2017-12-07 06:23:52 【问题描述】:

我面临一个问题:每次请求都会创建新的 sessionID。有人可以解释一下吗?

我正在使用的版本:

节点版本:v6.10.3 NPM 版本:3.10.10 快递@4.15.3 express-session@1.15.3

如果我没有专门设置 cookie,maxAge 的默认值是多少?不确定是否需要。

您发现下面的代码有什么问题吗?请帮忙,因为我被卡住了。

      var app = express();
        app.use(express.static(path.join(__dirname, 'landing')));
        app.use(bodyparser.json());
        app.set('trust proxy', 1) // trust first proxy
        app.use(session(
        secret: 'keyboard cat',
        resave: false,
        saveUninitialized: true,
        cookie: secure: true
    ))

    app.get('/', function (req, res) 
        res.sendFile(path.join(__dirname, 'landing', 'index.html'));
    );


    var contextPath = '/myportal';

    //UI url
    app.get(contextPath, function (req, res) 
        var reqValues;
              logger.info("req sessionID is :::" + req.sessionID);
           // do something
                 
        app.use(express.static(path.join(__dirname, 'build'))); //react UI path
        res.sendFile(path.join(__dirname, 'build', 'index.html'));
      

    //health check url
    app.get(contextPath + '/health', function (req, res) 
        logger.info("env is " + env);
        logger.info("myportal health is ok");
        res.send('Health Ok!\n');
    );

【问题讨论】:

你读过manual吗? 是的,我已经浏览了文档,这就是我尝试的方式,但不幸的是它对我不起作用。想知道我在这里缺少什么。 你必须使用https-express。 感谢 Aikon,是的,我已经在使用它了,因为我正在尝试将它部署在启用了 https 的服务器上。抱歉代码越来越大,所以无法在最初的问题中提供这些细节 PALLAMOLLA SAI 描述正确——我也面临同样的问题。简而言之,您可能使用了 post ,默认情况下不发送 cookie。要么使用 get,要么使用适当的标头发出 post 请求,该标头将发送 cookie。您可能需要验证 cookie-parser 是否也在您的节点服务器中定义 【参考方案1】:

如果还有人在寻找答案。 (经过大量工作后,以下代码对我有用。如果我错了,请纠正我)

原因:express session 将 sessionID 存储在 cookie 中,它会在后端(服务器)的前端(浏览器,您可以在浏览器中看到名为 connect.sid 的 cookie)设置该 cookie。每当任何请求首先来自浏览器时,它都会检查该 cookie(其中存储了 sessionID。)如果找到 cookie,它不会创建新会话,否则它将再次创建一个新会话。(您可以通过记录 req 来检查它.sessionID 请求)

解决方案:为了克服我们从前端(浏览器)发出的每个请求,我们必须将该 cookie 发送到后端(服务器)。服务器将自动解析 cookie,并且不会为每个请求创建任何新会话。

我使用 axios 进行请求调用,其中对于每个请求我都添加 withCredentals:true 以便浏览器可以将 cookie 发送到后端服务器(自动)。以下代码对我有用。

app.js

require('dotenv').config(path:'./config.env');

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const cors=require('cors');
const uuid = require('uuid/v4')
const cookieParser = require('cookie-parser');
const session = require('express-session');
var FileStore = require('session-file-store')(session);

app.use(cors(
 origin:[process.env.ORIGIN],//frontend server localhost:8080
 methods:['GET','POST','PUT','DELETE'],
 credentials: true // enable set cookie
));

app.use(cookieParser(process.env.SESSIONSECRET)); // any string ex: 'keyboard cat'
app.use(session(
  secret: process.env.SESSIONSECRET,
  store:new FileStore,
  cookie:
    maxAge:36000,
    httpOnly:false,
    secure:false // for normal http connection if https is there we have to set it to true
    ,
  resave: false,
  saveUninitialized: true
)) 

app.use(function(req, res, next) 

res.header('Access-Control-Allow-Credentials', true);
res.header('Access-Control-Allow-Methods', 'GET, PUT, POST, DELETE');
res.header("Access-Control-Allow-Origin", process.env.ORIGIN);
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-   Type, Accept, Authorization");
next();
);

app.use(bodyParser.json());
app.use(bodyParser.urlencoded(extended: true));

// rest of code is your mongo connection

axios 休息调用::

 axios.defaults.withCredentials = true;
 axios.get('http://localhost:8080/getDetails',
           headers:
                    withCredentials:true,

                   
  );

【讨论】:

我做的和你做的一模一样。每个请求的会话 ID 仍然是唯一的。

以上是关于每次刷新或访问页面时,Node js express-session都会创建新的会话ID的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io node.js,如何避免记录连接时间或考虑页面刷新/多个套接字?

每次重新加载后,Node.js Web 应用程序 chrome 内存使用量都会增加

Node.js刷新session过期时间

React.js身份验证在每次刷新时重定向到登录名

Node.js 护照 OAuth 2.0 身份验证:存储访问和刷新令牌的位置

Express / Node.js页面刷新问题