2012-12-27 22 views
8

Perché non ho definito un maxAge quando si chiama expressServer.use(express.session({params})) la scadenza del cookie è impostata come "Sessione".Cambia scadenza cookie in Express

Vorrei aggiungere una funzionalità "ricordami" al momento del login. Se "ricordami" è selezionato, la scadenza verrà estesa a un mese.

Come faccio a fare questo? Ho provato semplicemente estendendo il MaxAge, ma che non sembrava di fare nulla ...

expressServer.get '/blah', (request, response) => 
    request.session.cookie.maxAge = 2592000 
    response.end 'hello there' 

Grazie per l'aiuto!

** EDIT **

Ho provato a fare un server semplice per testare l'aggiornamento dei cookie di un utente. Sto usando espresso 3.0.4

Quando visito 127.0.0.1:9000/blah, del cookie del browser "scade" il campo è ancora "sessione" ...

express = require 'express' 

expressServer = express() 
expressServer.use express.cookieParser() 
expressServer.use express.session 
    secret: 'supersecret' 
    cookie: 
     path: '/' 
     httpOnly: true 

expressServer.get '/', (request, response) => 
    response.end 'hello' 

expressServer.get '/blah', (request, response) => 
    request.session.cookie.maxAge = 3600000 
    response.end 'hello again' 

expressServer.listen 9000 
console.log 'server running' 

Grrrrrrr ....

+0

Tuttavia, se posso eliminare i miei cookie del browser e visitare "/ bla", il "scade" campo è impostato correttamente. Il che ha senso, dal momento che il cookie deve essere impostato per la prima volta :) – user1161657

+1

Ok ... sembra funzionare SOLO se aggiorno la sessione ... Così ho appena aggiunto 'request.session.blah = Date()' e le cose funzionano magicamente? – user1161657

+0

Si potrebbe provare a [impostare maxAge con un valore predefinito] (http://www.senchalabs.org/connect/middleware-session.html) e quindi scadere il cookie se la casella di controllo non è selezionata (req.session.cookie .expires = false). – Frank

risposta

11

ho una casella di controllo che dice "ricordati di me" nella pagina/login:

<p class="remember"> 
    <input type="checkbox" id="remember" name="remember" value="1" /> 
    <label for="remember">Remember me</label> 
</p> 

Poi, nel mio percorso POST/login faccio un po 'sanity controllo e impostare la sessione se req.body.remember è impostato altrimenti il ​​suo solo a sessione di finestra:

//user is authenticated 
    //set session length 
    if (req.body.remember) { 
    var hour = 3600000; 
    req.session.cookie.maxAge = 14 * 24 * hour; //2 weeks 
    } else { 
    req.session.cookie.expires = false; 
    } 

    req.session.userid = user._id; 

Aggiungere le seguenti righe (io uso Redis) in app.js:

app.use(express.cookieParser('secret-word')); 
    app.use(express.session({ 
    store: new RedisStore({ 
     host: cfg.redis.host, 
     db: cfg.redis.db 
    }), 
    secret: 'another-secret' 
    })); 
+0

E questo aggiorna il cookie nel browser del cliente? – user1161657

+0

Per me, cambia il cookie della sessione sul back-end, ma in realtà non cambia nulla nel browser: '( – user1161657

+0

Ho aggiornato la risposta. Sto usando redis, questo è tutto ciò che dovevo fare per farlo funzionare – chovy

2

ho trovato un answer che sembra funzionare per me; aggiungilo all'inizio dei tuoi percorsi.

app.all '*', (req,res,next) -> 
    if req.method is 'HEAD' or req.method is 'OPTIONS' 
    next() 
    else 
    req.session._garbage = Date(); 
    req.session.touch(); 
    next(); 
3

Imposta il nome del cookie sul valore, dove può essere una stringa o un oggetto convertito in JSON. L'opzione di percorso per default è "/".

res.cookie('rememberme', '1', 
       { expires: new Date(Date.now() + 900000), httpOnly: true }); 

Per ulteriori riferimenti seguenti link possono essere utilizzati

http://expressjs.com/api.html#res.cookie

5

Se si desidera implementare le sessioni a rotazione con cookie-sessions a Express 4, configurare il middleware come questo:

app.use(cookieSession({ 
    secret: your_secret, 
    maxAge: your_maxAge, 
    key: 'sessionId' 
})); 

Nota che non è necessario impostare l'opzione expires.

Al fine di estendere la sessione, è sufficiente modificare in questo modo:

app.get('*', function (req, res, next) { 
    req.session.foobar = Date.now(); 
    next(); 
} 

Si noti che in Express 4 non c'è req.session.touch().

0

Oppure può provare questo, ha funzionato per me:

if (req.body.remember) 
{ 
    var oneWeek = 7 * 24 * 3600 * 1000; //1 weeks      
    req.session.cookie.expires = new Date(Date.now() + oneWeek); 
    req.session.cookie.maxAge = oneWeek; 
} 
Problemi correlati