web-dev-qa-db-ja.com

Express.jsのセッションのみのCookie

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

一方、セッションのみのCookieは情報をブラウザのメモリに保存し、ブラウザセッションの期間中利用できます。つまり、セッションCookie内に保存されたデータは、保存時からブラウザが閉じられるまで利用できます。この間にページ間を移動しても、データは消去されません。

Express.js を使用してこれをどのように達成できますか?

23
Alfred

以下は私が欲しかったものです。ブラウザを閉じると情報が消えます。

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');
11
Alfred

まず、そのWebサイトは恐ろしい場所です。

それでは質問です。

実際のセッションとは:

  • データはサーバー側に保存されます。
  • IDを含むCookieが発行されます。
  • ブラウザがCookieを送信するため、このIDはリクエストごとにサーバーに送り返されます。
  • これで、サーバーはCookieのID(一般にSession IDまたはshort 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のオプションの詳細を確認できます ここ

65
Ivo Wetzel
app.use(express.session({cookie: { path: '/', httpOnly: true, maxAge: null }, secret:'eeuqram'}));

上記はIE8、Firefox、Chromeで動作します。重要な部分はmaxAge:nullです。

7
Ustaman Sangat
app.get('/remember', function(req, res) {
   res.cookie('rememberme', 'yes', { expires: 0, httpOnly: true });
 });

これにより、セッションCookieが設定されます。ブラウザを閉じると消去されます!

2
Raja

以下は、更新された 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);
1
Raja