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

时间:2017-07-03 23:00:13

标签: node.js npm sessionid express-session

我遇到了这个问题:每次请求都会创建新的sessionID。有人可以对此嗤之以鼻吗?

我正在使用的版本:

NODE VERSION:v6.10.3 NPM版本:3.10.10 express@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');
    });

1 个答案:

答案 0 :(得分:0)

如果仍然有人在寻找答案。 (在工作了很多之后,以下代码为我工作了。如果我错了,请纠正我)

原因:快速会话将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,

                   }
  });