web-dev-qa-db-ja.com

ExpressJSセッションがアクティビティにもかかわらず期限切れになる

この質問をSOに持ってくる エクスプレスグループには答えがなかったので

セッションmaxAge = 900000を設定していますが、セッションCookieのexpiresプロパティが正しく設定されていることがわかります。ただし、後続のリクエストでは、タイムアウトは延長されません。拡張されることはなく、Cookieは最終的に期限切れになります。

セッションミドルウェアのドキュメント セッションミドルウェアが私に代わって行うので、Session#touch()は必要ないと言っています。実際にreq.session.touch()を手動で呼び出してみましたが、何もしませんでした。また、req.session.cookieにもmaxAgeを設定しようとしましたが、何もしませんでした:

アクティブなセッションを自動的に延長する設定がどこかにありませんか?リクエストごとに手動でCookieを再作成する以外に、エンドユーザーのアクティビティ後にセッションタイムアウトを延長する方法は他にありますか?


編集:Expressv3でこの問題が発生しました。 100%確信はありませんが、---(express changelog からのこのメモが原因である可能性があります。

26
jckdnk111

他の誰かが同じ問題を抱えている場合の解決策は次のとおりです。

function (req, res, next) {

    if ('HEAD' == req.method || 'OPTIONS' == req.method) return next();

    // break session hash / force express to spit out a new cookie once per second at most
    req.session._garbage = Date();
    req.session.touch();

    next();

}
18
jckdnk111

ローリングセッションは、エクスプレスセッションに存在するようになりました。オプションでローリング属性をtrueに設定すると、現在の時刻に適用されるmaxAgeオフセットを設定することにより、有効期限の値が再計算されます。

https://github.com/expressjs/session/issues/

https://github.com/expressjs/session/issues/

https://github.com/expressjs/session (ローリングを検索)

たとえば、rollingに注意してください。

app.use(session({
  secret: 'a secret',
  cookie: {
    path: '/',
    httpOnly: true,
    secure: false,
    maxAge: 10 * 60 * 1000
  },
  rolling: true
}));
27
gdw2