2016-11-03 2 views
0

Mit express js mit express-session Ich habe diese klassische Haupt-Session Middleware, die maxAge des Cookies zu einer Stunde definiert.So schließen Sie Routen von der Verlängerung Express-Cookie Ablaufdatum

var express   = require('express'); 
var session   = require('express-session'); 
var RedisStore  = require('connect-redis')(session); 

var ExpressServer = express(); 

ExpressServer.use(
    session(
     { 
      secret    : 'secret', 
      // Forces session to be saved even when unmodified 
      resave    : false, 
      rolling    : true, 
      // Forces session to be saved even when unmodified 
      saveUninitialized : true, 
      // Controls result of unsetting req.session (through delete, setting to null) 
      unset    : 'destroy', 
      cookie: { 
       path: '/', 
       proxy: secureCookie, 
       secure: secureCookie, 
       httpOnly: true, 
       maxAge: 1000 * 60 * 60 
      }, 
      store: new RedisStore(
       { 
        client: RedisClient 
       } 
      ) 
     } 
    ) 
); 

Allerdings habe ich einige Strecken, die in regelmäßigen Abständen aufgerufen werden (alle 30 Sekunden) vom Client zum Server, sagen wir, einer von ihnen ist:

ExpressServer.get(
'/periodic', 
function (req, res, next) { 
    //doSomthing() 
} 

da diese Strecke regelmäßig aus aufgerufen wird der Kunde, ich brauche, dass es keine Verlängerung des Ablaufdatums des Cookies (falls der Benutzer seinen Browser geöffnet lässt) und verlassen das aktuelle Ablaufdatum (von der letzten nicht periodischen Route Anruf)

Wie kann Ich erreiche es?

Antwort

0

Einfach den ExpressServer.get('/periodic') Anruf vor den ExpressServer.use(session()) Anruf setzen. Oder Sie können wie etwas tun:

var url = require('url'); 
var normalSessionOpts = { 
    secret    : 'secret', 
    // Forces session to be saved even when unmodified 
    resave    : false, 
    rolling    : true, 
    // Forces session to be saved even when unmodified 
    saveUninitialized : true, 
    // Controls result of unsetting req.session (through delete, setting to null) 
    unset    : 'destroy', 
    cookie: { 
     path: '/', 
     proxy: secureCookie, 
     secure: secureCookie, 
     httpOnly: true, 
     maxAge: 1000 * 60 * 60 
    }, 
    store: new RedisStore(
     { 
      client: RedisClient 
     } 
    ) 
}; 
var nonRollingSessionOpts = Object.assign({}, normalSessionOpts, { rolling: false }); 
var normalSession = session(normalSessionOpts); 
var nonRollingSession = session(nonRollingSessionOpts); 

ExpressServer.use(function (req, res, next) { 
    var parsedUrl = url.parse(req.url) 
    return parsedUrl.pathname === '/periodic' 
     ? nonRollingSession(req, res, next) 
     : normalSession(req, res, next); 
}); 
+0

In Bezug auf Ihre erste Option, habe ich versucht, es aber nicht zu helfen scheint, da die 'maxAge' Parameter das gleiche aus dem Aufruf bleibt vor, so dass es es trotzdem zu erneuern. Könnten Sie bitte Ihre zweite Option erklären? Wie wird es hier helfen, die "rollende" Option auszuschalten? Das 'maxAge' wirkt sich immer noch auf die Sitzung aus. – TomG

+0

@TomG [gemäß der Dokumentation] (http://expressjs.com/en/resources/middleware/session.html#rolling) Das Setzen von 'rolling' auf' true' bedeutet, dass "das Ablaufdatum auf das Original [' 'zurückgesetzt wird maxAge "] (http://expressjs.com/en/resources/middleware/session.html#cookiemaxage), um den Ablauf-Countdown zurückzusetzen." Wenn Sie den Wert für diese bestimmte Route auf "false" setzen, wird der Sitzungscookie nicht mit einer neuen Ablaufzeit aktualisiert. – idbehold

+0

gut, ich habe es versucht und es hat nicht funktioniert. Ich berühre die Sitzung, also ist das vielleicht das Problem? Ich brauche die Sitzungsdaten, nur um das Ablaufdatum nicht zu aktualisieren – TomG

Verwandte Themen