2017-10-22 120 views
2

Expressでセッションを作成するためのコードは次のとおりです。Express Session異なる期限切れ

app.use(session({ 
    secret: 'randomstring', 
    saveUninitialized: false, 
    resave: false, 
    cookie: { 
     secure: true, 
     maxAge: 60000 * 60 /* 1 hour */ 
    } 
})); 

私はこれを主に使用して、セッションデータをPassport.jsに保存します。現在、ユーザーは1時間後に自動的にログアウトします。またはセッションが終了し、ユーザーがログアウトします。

セッションにさらにデータを格納し、異なる情報の有効期限が異なる簡単な方法はありますか?つまり、Passport.js(req.session.passport.user)セッションデータの有効期限を1時間にしたいとします。そして、別のデータでは、例えば、(req.session.myDataA)の有効期限が30日であるとします。また、もう1つのデータ(req.session.myDataB)に有効期限がなく、永久にアクティブにしておきたい。

Expressセッションでこの動作を実現する簡単な方法はありますか?

+0

何らかの理由(https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage)? –

+0

@ GabrielBleuローカルストレージには、セッションタイプのデータを格納するという点で欠点があります。 Cookieは、すべてのリクエストと共に特定のドメインに送信されます。ローカルストレージはそうではありません。 –

答えて

2

クッキーを使用し、異なるクッキー名に異なる期限を設定することができます。したがって、データを保持し、それぞれが特定の有効期限を持つ複数のCookieを持つことができます。

私は、セッションとCookieの両方が問題の正しい解決策ではないと言います。あなたのセッションをリーンにして、データをデータベースに保存します。セッションを使用している場合、Redisを使用して期限切れのデータを保存することができます。 Redisのキーをセッションに割り当てることができます。たとえば:あなたはRedisの中で、あなたのデータを設定すると

req.session.myDataA = 'user_id:myDataA' 
req.session.myDataB = 'user_id:myDataB' 

、あなたはキーuser_id:myDataAを使用して期限切れにそれを設定することができます。

// Will expire in 1 hour 
SET user_id:myDataA "your data" 
EXPIRE user_id:myDataA 3600 

キーはまだセッションになりますが値がnullであるか、あなたが期待しているデータを持っている場合、あなたは確認することができます。

これはおそらくもう少し複雑に聞こえるかもしれませんが、セッションの良い練習としても、管理の難しさになるため、参照キーを超えて多くのデータを格納したくないということは本当にありません。

MongoDBを使用している場合は、期限切れになるように文書を設定することもできます。しかし、いずれかを使用していない場合は、通常、レディスが簡単にセットアップでき、優れたセッションストアとして機能します。

編集:

としてではなく、あなたは様々な時間枠で、ちょうど有効期限を使用して、データ内のフィールドを設定することであることはできませんセッションの期限切れのため、下記のコメントしています。その後、そのデータを取得したら、有効期限を過ぎているかどうかを確認します(1時間、30日など)。

+0

私は今、私はセッションにユーザーIDを格納していることを意味します。しかし、Passport.jsはそのほとんどを処理します。私はこの答えが私が探しているものより少し複雑だと思う。可能であれば、私は既存のPassportと統合したいと考えています。可能な限り高いレベルに保つようにしてください。 –

+2

おそらく最も簡単な解決策は、セッションを期限切れにするのではなく、期限切れの時間枠でデータを設定することです。その後、そのデータを取得したら、有効期限を過ぎているかどうかを確認します(1時間、30日など)。 – dzm

+0

良い解決策のように聞こえる –

0

あなたは他のミドルウェアでのセッションのMAXAGEを設定することができ

コード:[のlocalStorage]を使用していないため

// after session and passport middleware 
app.use(function(req, res, next) { 
    if (req.session.user) { // some condition 
     req.session.cookie.maxAge = 1000 * 60 * 60 * 24 // 24 hours 
    } else if (req.session.myData) { 
     req.session.cookie.maxAge = 1000 * 60 * 60 

    } 
    // another condition 

    // save the session 
    req.session.save() 

    // add next at the end of middleware 
    // so it can pas data edited to another middleware 
    next() 
}) 
+0

うまくいきませんが、セッションでuserとmyDataを保存したい場合は、うまくいきません。セッションに複数のものを格納し、それぞれに異なる有効期限を設定したいと思います。 –

+0

私は、あなたがセッションが異なる期限切れの「もの」を意味したのですか?セッションが終了したら期限切れになるか? – egon12

+0

はい。だから私はセッションで複数のことがあります。それぞれ異なる有効期限を持つ。セッション自体は期限切れにならないようにしています。その中のものは期限が異なります。 –

関連する問題