24

http://www.javascriptkit.com/javatutors/cookie.shtml

另一方面,仅会话 cookie 将信息存储在浏览器内存中,并且在浏览器会话期间可用。换言之,存储在会话 cookie 中的数据从存储之日起一直可用,直到浏览器关闭。在此期间从一页移动到另一页不会擦除数据。

如何使用Express.js实现这一点?

4

6 回答 6

65

首先,该网站是一个可怕的去处。

现在谈谈这个问题。

实际上是什么会话:

  • 数据存储在服务器端。
  • 发出一个包含 ID 的 cookie。
  • 由于浏览器会发送 cookie,因此该 ID 在每次请求时都会发送回服务器。
  • Session ID现在,服务器可以将 cookie 中的 ID(通常称为或简称SID)与存储在服务器上的会话数据重新关联起来。

Express.js 支持内置的会话

该示例显示的内容:

  • 设置 Express.js 中间件
  • 使用第三方存储来保存会话数据,在这种情况下是Redis(IMO 对于您的问题 atm 来说太过分了)

安装 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,例如会话的最长生命周期等。

于 2010-12-06T22:13:37.587 回答
11

以下是我想要的(有点)。当我关闭浏览器时,信息消失了。

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');
于 2010-12-06T22:44:05.973 回答
7
app.use(express.session({cookie: { path: '/', httpOnly: true, maxAge: null }, secret:'eeuqram'}));

以上适用于 IE8、Firefox 和 Chrome。重要的部分是maxAge:null

于 2012-01-12T15:59:47.977 回答
2
app.get('/remember', function(req, res) {
   res.cookie('rememberme', 'yes', { expires: 0, httpOnly: true });
 });

这将设置会话 cookie。在浏览器关闭时,它将被删除!

于 2011-09-07T11:01:27.260 回答
1

以下是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);
于 2011-09-05T14:14:05.520 回答
0

我知道这是一个老问题,但我要添加一个答案,因为这里的所有答案似乎都已过时、存在安全漏洞或完全错误。

到目前为止, 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;
}
于 2021-10-15T00:51:07.603 回答