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 (問題の atm に対して IMO はやり過ぎです)

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 に答える
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

これは古い質問であることは知っていますが、ここでのすべての回答は時代遅れであるか、セキュリティ上の欠陥があるか、単に間違っているように見えるため、回答を追加しています。

現在のところ、express はMemoryStoreデフォルトで を使用しているため、明示的に処理する必要はありません。

また、現時点では、express-session の公式 readme ページには、最初に、本番用のセッション ストアとして使用しないようにという厳しい警告があり、次の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 に答える