http://www.javascriptkit.com/javatutors/cookie.shtml
与之不同的是,仅会话(Session-only)Cookie将信息存储在浏览器内存中,在浏览器会话期间可用。换句话说,存储在会话Cookie内的数据从存储时起一直可用,直到关闭浏览器。在此期间从页面到页面的跳转并不会擦除数据。
我如何使用Express.js实现这一点呢?
http://www.javascriptkit.com/javatutors/cookie.shtml
与之不同的是,仅会话(Session-only)Cookie将信息存储在浏览器内存中,在浏览器会话期间可用。换句话说,存储在会话Cookie内的数据从存储时起一直可用,直到关闭浏览器。在此期间从页面到页面的跳转并不会擦除数据。
我如何使用Express.js实现这一点呢?
首先,那个网站是一个非常糟糕的去处。
现在进入问题。
什么是Session:
示例显示了什么:
安装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”选项的更多信息,例如会话的最长生存时间等。此处。MemoryStore
并不是为生产环境而设计的。在大多数情况下,它会泄漏内存,无法扩展到单个进程之外,并且仅适用于调试和开发。有关存储列表,请参见兼容的会话存储。” - Mythosvar 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'}));
app.get('/remember', function(req, res) {
res.cookie('rememberme', 'yes', { expires: 0, httpOnly: true });
});
以下是使用 Express.js 的 Alfred's answer 的更新代码。
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);
我知道这是一个老问题,但我还是要添加一个答案,因为这里的所有答案似乎都已经过时、存在安全漏洞或者完全错误。
截至目前,express默认使用MemoryStore
,您不需要显式处理它。
此外,截至目前,express-session的官方自述页面在开头有一个醒目的警告,不要将MemoryStore
用作生产环境的会话存储,引用如下:
警告 默认的服务器端会话存储MemoryStore,故意不设计用于生产环境。在大多数情况下,它会泄漏内存,无法扩展到单个进程之外,并且仅用于调试和开发。
有关存储列表,请参见兼容的会话存储。
如果您想使用MongoDBStore进行会话存储,这里有一个简单的解决方案:connect-mongodb-session
。
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;
}