2015-08-11 17 views
9

ich konfigurieren, dass die Express-Session-Plugin wie folgt aus:Express-Sitzung in 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 

In den Chrome und Mozilla Firefox-Browser, nur eine Sitzung für den Benutzer erstellt. Diese Sitzung ist auf allen Routen verfügbar, die die Middleware sessionMW verwenden. Wenn Sie also eine GET- oder POST-Anfrage an/api/users/or/api/sessions senden, wird die gleiche Sitzungs-ID in einem Cookie gespeichert und für jede Anfrage im Cookie-Header gesendet.

Internet Explorer funktioniert nicht so. Für jede Anfrage wird eine neue Sitzung erstellt. Die Sitzung wird auf dem Server gespeichert und ich habe bestätigt, dass für jede Route der Anwendung ein neuer Cookie im Browser vorhanden ist.

Ich habe die Domäne, den Pfad und den Ablauf in den Cookies definiert. Der Cookie im IE zeigt diese Werte an.

Ich benutze CookieParser nicht, so dass das Problem nicht sein kann.

Das Problem scheint auf der Client-Seite sowieso zu sein. Internet Explorer sendet den Cookie-Header nicht mit der Anforderung. Es empfängt den Set-Cookie-Header in der Antwort für jede Anfrage. Die Daten werden jedoch bei nachfolgenden Anforderungen nicht erneut verwendet.

Könnte das ein CORS-Problem sein? Der Cookie ist nicht für dieselbe Domäne, auf der ich die Anwendung ausführe. Ich brauche eine Sitzung auf allen Routen der API in einer anderen Domäne gehostet.

Die clientseitige konfiguriert ist Cookies in CORS-Anfragen enthalten:

Access-Control-Allow-:

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

ich diese accept-Control-Header in Antwort auf jede Anforderung senden Credentials: true

Access-Control-Allow-Header: Ursprung, X-Requested-With, Content-Type,

Accept Access-Control-Allow-Methoden: OPTIONS, GET, POST, PUT PATCH

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

Warum IE nicht die Cookie-Header in den Anforderungen einstellen? Die Domain hat keinen Unterstrich in ihrem Namen und sie beginnt nicht mit einer Nummer.

+0

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

Antwort

1

Stellen Sie sicher, dass die Zeitzone und die Uhrzeit Ihres Servers korrekt sind. Ich habe gerade ein Problem behoben, bei dem die Zeit des Servers lokal ist, aber die Zeitzone auf UTC eingestellt wurde. Irgendwie haben Chrome und Firefox den Ablauf noch korrekt interpretiert, aber der IE hat die UTC-Zeitzone eingehalten, so dass der Cookie in seinen Augen bereits abgelaufen war. Beachten Sie, dass es nur sofort abläuft, wenn Sie sich in einer negativen Zeitzone in Bezug auf UTC befinden.

+0

Es wurde für mich repariert, vielen Dank. – Faisal

0

Nach Unterstreichung in Ihrem Domain-Namen kann dieses Problem auch verursachen.

IE und Edge speichern keine Cookies der Domain-Namen einschließlich Unterstreichung.