2015-08-11 34 views
9

ho configurare il plugin espresso sessione in questo modo:espresso tornata di Internet Explorer

var express = require('express'), 
    session = require('express-session'), 
    uuid = require('node-uuid'); 

var expiration_day = new Date('9/15/2015'), 
    today = new Date(), 
    session_life = Math.abs(expiration_day.getTime() - today.getTime()); 

var config = { 
    name: 'mycookie', // session ID cookie name 
    key: 'mycookie', // session ID cookie name 
    secret: '$FGDFH$W#WEgfgdf', 
    hash: { 
     salt: '9883hjHFIDSU&U#H' 
    }, 
    store: new MongoStore({mongooseConnection: db}), 
    unset: 'keep', //never remove expired sessions 
    saveUninitialized: true, //always create session, even if nothing is stored 
    resave: false, //don't save session if unmodified 
    ttl: session_life, 
    autoRemove: 'disabled', //disable expired sessions cleaning 
    genid: function (req) { 
     "use strict"; 
     return uuid.v4(); 
    }, 
    cookie: { 
     path: '/api', // cookie will be stored for requests under '/api' 
     httpOnly: false, 
     domain: 'example.com', 
     secure: false, 
     expires: expiration_day, 
     maxAge: session_life 
    } 
}; 

app.sessionMW = session(config);//session middleware 

nei browser Chrome e Mozilla Firefox, una sola sessione viene creato per l'utente. Questa sessione è disponibile su tutte le rotte che utilizzano il middleware sessionMW. Quindi se si esegue una richiesta GET o POST a/api/users/or/api/sessions, lo stesso ID di sessione viene memorizzato in un cookie e viene inviato nell'intestazione del cookie per ogni richiesta.

Internet Explorer non funziona in questo modo. Per ogni richiesta, viene creata una nuova sessione. La sessione è archiviata sul server e ho confermato che c'è un nuovo cookie nel browser per ogni percorso dell'applicazione.

Ho definito il dominio, il percorso e la scadenza nei cookie. Il cookie in IE mostra questi valori.

Non uso cookieParser, quindi non può essere il problema.

Il problema sembra essere sul lato client, comunque. Internet Explorer non invia l'intestazione del cookie con la richiesta. Riceve l'intestazione del set-cookie nella risposta per ogni richiesta. Ma i dati non vengono mai riutilizzati nelle richieste successive.

Potrebbe essere un problema CORS? Il cookie non è per lo stesso dominio su cui sto eseguendo l'applicazione. Ho bisogno di una sessione su tutte le rotte dell'API ospitata su un altro dominio.

Il lato client è configurato per includere i cookie nelle richieste CORS:

$.ajaxSetup({ 
    cache: false, 
    xhrFields: { 
     withCredentials: true //all AJAX requests should include Cookie data 
    } 
}); 

mando queste intestazioni di controllo accetta-in risposta a ogni richiesta:

Access-Control-Allow- credenziali: true

Access-Control-Allow-intestazioni: le sue origini, X-richiesta-Con, Content-Type,

Accetta Access-Control-Allow-Metodi: OPZIONI, GET, POST, PUT, PATCH

Access-Control-Allow-Origin: http://example.com

Perché IE non Impostazione dell'intestazione del cookie nelle richieste? Il dominio non ha underscore nel suo nome e non inizia con un numero.

+0

https: //developer.mozilla.org/it-it/docs/Web/API/XMLHttpRequest # xmlhttprequest-withcredentials – robertklep

risposta

1

Assicurarsi che il fuso orario e l'ora del server siano corretti. Ho appena terminato il debug di un problema in cui l'ora del server è locale ma il fuso orario è stato impostato su UTC. In qualche modo Chrome e Firefox hanno ancora interpretato correttamente la scadenza, ma IE ha onorato il fuso orario UTC, quindi il cookie era già scaduto nei suoi occhi. Si noti che scadrà immediatamente solo se si è in un fuso orario negativo rispetto a UTC.

+0

Risolto per me, grazie mille. – Faisal

0

Avere sottolineato nel nome del dominio può anche causare questo problema.

IE e Edge non memorizzano i cookie dei nomi di dominio, inclusa la sottolineatura.