每次刷新或访问页面时,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 内存使用量都会增加