http://www.javascriptkit.com/javatutors/cookie.shtml
另一方面,仅会话 cookie 将信息存储在浏览器内存中,并且在浏览器会话期间可用。换言之,存储在会话 cookie 中的数据从存储之日起一直可用,直到浏览器关闭。在此期间从一页移动到另一页不会擦除数据。
如何使用Express.js实现这一点?
http://www.javascriptkit.com/javatutors/cookie.shtml
另一方面,仅会话 cookie 将信息存储在浏览器内存中,并且在浏览器会话期间可用。换言之,存储在会话 cookie 中的数据从存储之日起一直可用,直到浏览器关闭。在此期间从一页移动到另一页不会擦除数据。
如何使用Express.js实现这一点?
首先,该网站是一个可怕的去处。
现在谈谈这个问题。
实际上是什么会话:
Session ID
现在,服务器可以将 cookie 中的 ID(通常称为或简称SID
)与存储在服务器上的会话数据重新关联起来。该示例显示的内容:
安装 Redis 需要做很多工作,但也可以使用 Express.js 的内置内存存储:
var express = require('express');
var app = express.createServer();
var MemoryStore = require('connect/middleware/session/memory');
app.use(express.bodyDecoder());
app.use(express.cookieDecoder());
app.use(express.session({ store: new MemoryStore({ reapInterval: 60000 * 10 }) }));
app.get('/', function(req, res){
req.session.visitCount = req.session.visitCount ? req.session.visitCount + 1 : 1;
res.send('You have visited this page ' + req.session.visitCount + ' times');
});
app.listen(4000);
这将简单地跟踪您访问该页面、关闭浏览器并重新打开的次数。计数仍然存在。
您可以在此处找到有关 选项的更多信息MemoryStore
,例如会话的最长生命周期等。
以下是我想要的(有点)。当我关闭浏览器时,信息消失了。
var express = require('express');
var app = express.createServer();
var MemoryStore = require('connect/middleware/session/memory');
app.use(express.bodyDecoder());
app.use(express.cookieDecoder());
app.get('/remember', function(req, res) {
res.cookie('rememberme', 'yes', { expires: new Date() - 1, httpOnly: true });
});
app.get('/', function(req, res){
res.send('remember: ' + req.cookies.rememberme);
});
app.listen(4000, '127.0.0.1');
app.use(express.session({cookie: { path: '/', httpOnly: true, maxAge: null }, secret:'eeuqram'}));
以上适用于 IE8、Firefox 和 Chrome。重要的部分是maxAge:null
app.get('/remember', function(req, res) {
res.cookie('rememberme', 'yes', { expires: 0, httpOnly: true });
});
这将设置会话 cookie。在浏览器关闭时,它将被删除!
以下是Alfred 答案的更新代码(使用 Express.js 的会话)。
var express = require('express');
var app = express.createServer();
var MemoryStore = require('/home/node/node_modules/connect/lib/middleware/session/memory');
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({
key: 'some-key',
secret: 'some-We1rD sEEEEEcret!',
store: new MemoryStore({ reapInterval: 60000 * 10 })
}));
app.get('/', function(req, res) {
req.session.visitCount = req.session.visitCount ? req.session.visitCount + 1 : 1;
res.send('You have visited this page ' + req.session.visitCount + ' times');
});
app.listen(4000);
我知道这是一个老问题,但我要添加一个答案,因为这里的所有答案似乎都已过时、存在安全漏洞或完全错误。
到目前为止, expressMemoryStore
默认使用,您不需要显式处理它。
此外,截至目前,express-session 的官方自述页面在开始时有一个明显的警告,不要MemoryStore
用作生产的会话存储,引用:
警告 默认的服务器端会话存储 MemoryStore 故意不是为生产环境设计的。它在大多数情况下会泄漏内存,不会扩展到单个进程,并且用于调试和开发。
有关商店列表,请参阅兼容的会话商店。
connect-mongodb-session
如果您想使用 MongoDBStore 进行会话存储,这是一个简单的解决方案:
import express from 'express';
import session from 'express-session';
import ConnectMongoDbSession from 'connect-mongodb-session';
const app = express();
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
app.use(session({
secret: < COOKIE_SECRET >,
name: 'sessionId', // Don't use the default name, see http://expressjs.com/en/advanced/best-practice-security.html
cookie: {
httpOnly: true,
secure: true, // Remove this if you're not using HTTPS, but it will be a massive security flaw
sameSite: 'strict',
},
store: getStore(),
// Boilerplate options, see:
// * https://www.npmjs.com/package/express-session#resave
// * https://www.npmjs.com/package/express-session#saveuninitialized
resave: true,
saveUninitialized: true,
}));
function getStore() {
const MongoDBStore = ConnectMongoDbSession(session);
const store = new MongoDBStore({
uri: < DATABASE_URI >,
collection: < SESSION_COLLECTION_NAME >,
connectionOptions: {
useNewUrlParser: true,
useUnifiedTopology: true,
},
});
store.on('error', (error: any) => {
console.error(error);
});
return store;
}