web-dev-qa-db-ja.com

Node.jsとExpressセッションの処理-戻るボタンの問題

Expressアプリケーションに制限領域 '/ dashboard'があります。アクセスを制限するために非常に小さな関数を使用します。

app.get('/dashboard', loadUser, function(req, res){
  res.render('dashboard', {
    username: req.session.username
  });
});

function loadUser(req, res, next){
  if (req.session.auth) {
    next();
  } else {
    res.redirect('/login');
  }
};

問題は、電話をかけてユーザーをログアウトすると...

app.get('/logout', function(req, res){
  if (req.session) {
    req.session.auth = null;
    res.clearCookie('auth');
    req.session.destroy(function() {});
  }
  res.redirect('/login');
});

...セッションは強制終了されますが、ブラウザで[戻る]ボタンを押すと、ブラウザのキャッシュから制限されたページが取得されました。これは、「/ダッシュボード」でGETがなく、ユーザーログインの検証がないことを意味します。

Meta(Jade Template)でキャッシュなしを使用しようとしましたが、それでも機能しません。

meta(http-equiv='Cache-Control', content='no-store, no-cache, must-revalidate')
meta(http-equiv='Pragma', content='no-cache')
meta(http-equiv='Expires', content='-1')

誰でも?

19
Pono

ジョシュの答えは悲しいことに私にはうまくいきませんでした。しかし、いくつか検索した後、私はこの質問を見つけました: キャッシュとブラウザの戻るボタンを処理するための最良の方法は何ですか?

そして、このnode.js/expressの問題に対する答えを採用しました。次の行を変更するだけです

res.header('Cache-Control', 'no-cache');

res.header('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0');

これで、ブラウザの戻るボタンを使用するたびに、ページが再読み込みされ、キャッシュされません。

* Express v4.xの更新*

// caching disabled for every route
server.use(function(req, res, next) {
  res.set('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0');
  next();
});

// otherwise put the res.set() call into the route-handler you want
53
pkyeck
app.get('/dashboard', loadUser, function(req, res){
  res.header('Cache-Control', 'no-cache');
  res.header('Expires', 'Fri, 31 Dec 1998 12:00:00 GMT');

  res.render('dashboard', {
    username: req.session.username
  });
});
6
Josh

Express ^ 4.16.3を使用して使用していますが、@ pkyeckで述べられているようにこれでうまくいきました。

私はそれをこのように私のルートに追加しました、そしてそれはうまくいきました:

routes
.use(function(req, res, next) {
res.set('Cache-Control', 'no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0');
        next();
          })
          .get('/login', function(req, res, next){
              .....
})
3
Basil

簡単な解決策は、セッションをクリアした後..再び同じルートにリダイレクトすることです..例:ルート/ sessionedpageにはセッション変数があります..ログアウトボタンをクリックした後req.session.destroy(function() {});でセッション変数をクリアした後、リダイレクトしようとしていますホームページ...ホームページにリダイレクトする代わりに..redirect/sessionedpage(同じルート).../sessionedpage if(!res.sessions)then res.redirect( '/ home')のif条件を書き込む