2013-03-04 9 views
16

Ich habe zu meinem Erstaunen auf den ersten Blick festgestellt, dass mein Denken darüber, wie sich Session-Cookies auf mobilen Geräten verhalten, von der Realität abgelöst wird.Simulieren Sie Sitzungscookies in mobilen Sitzungen?

Auf normalen Desktop-Browsern ist das Verhalten eines Session-Cookie zu speichern, solange der Browser-Sitzung aktiv ist. Die Sitzung sollte geschlossen werden, wenn das letzte Browserfenster/der letzte Browserprozess geschlossen ist.

nun auf mobilen Geräten, die Sie so gut wie nie einen Browser App schließen, können Sie es einfach in den Hintergrund senden.

entdeckte ich auf meinem Sony Xperia Ray mit Android 4, dass die Session-Cookie nicht abgelaufen ist, auch wenn ich den Browser-Prozess löschen. Aber auf einem Samsung Tablet-Gerät würde es. Ich weiß nicht, wie sich iOS-Geräte auf diese Weise verhalten.

Das ist ein Problem !? Was soll ich tun, um es zu umgehen?

Vorerst entschied ich, den Cookie an einem Tag ablaufen zu lassen. Aber ich bin nicht sehr glücklich damit.
Sollte ich die Lebensdauer senken? Vielleicht zu 8 Stunden?

+1

Was ist Ihr Ziel? Beenden Sie es, wenn Sie die Seite verlassen? Stellen Sie keine Anfrage in einer bestimmten Zeit ein? Oder senden Sie ihren Browser in den Hintergrund? Welches Backend verwenden Sie? – FakeRainBrigand

+0

Ich dachte an einen allgemeineren Ansatz. Was soll ich beachten etc. Insbesondere ist mein Ziel, dass ich mich an die Entscheidung erinnere, ob jemand Geopositionierung mit Javascript zulässt, aber nicht aus Datenschutzgründen (in Deutschland). Backend normalerweise drupal oder typo3 auf LAMP. – HerrSerker

+1

Wie wäre es damit, den Benutzer einfach eine Dauer wählen zu lassen, wie "1 Stunde erlauben", "1 Tag erlauben", "für immer zulassen", etc. – Dave

Antwort

4

Wäre es sinnvoll für Sie, den HTML5-Weg zu gehen und sessionStorage zu verwenden?

Auf diese Weise können Sie unabhängig davon sein, wie verschiedene Geräte Browsersitzungen verarbeiten, da der HTML5-Sitzungsspeicher pro Fenster ist und daher auf die Lebensdauer des Browsers Fenster beschränkt ist.

Grundsätzlich sind alle mobilen Geräte unterstützen session (siehe here) und man konnte einen Rahmen/Plugin wie jQuery-Session-Plugin haben (folgen this link) behandeln die Sitzungsdaten für Sie (und bieten eine Ausweich zu Session-Cookies für alte Browser, die sessionStorage nicht unterstützen).

EDIT: Um das Verhalten von session vs. local zu zeigen, habe ich eine Geige geschaffen, dass (zu Demonstrationszwecken) verwendet session zum Speichern der Breite eines div und localstorage für die Höhe des gleichen Speicherung div:

var randomWidth, 
    randomHeight; 
if (!(randomWidth= $.session.get("randomWidth"))) { // assignment 
    randomWidth = Math.random() * 300; 
    $.session.set("randomWidth", randomWidth, true); 
    console.log("just assigned and stored in sessionStorage: randomWidth: " + randomWidth); 
} else { 
    console.log("from sessionStorage: randomWidth: " + randomWidth); 
} 
if (!(randomHeight= $.domain.get("randomHeight"))) { // assignment 
    randomHeight = Math.random() * 300; 
    $.domain.set("randomHeight", randomHeight, true); 
    console.log("just assigned and stored in localStorage: randomHeight: " + randomHeight); 
} else { 
    console.log("from localStorage: randomHeight: " + randomHeight); 
} 
$(".test").css({width: randomWidth, height: randomHeight}); 

Schauen Sie sich die Konsole an. Wenn Sie eine neue Sitzung Ihres Clientbrowsers initiieren, wird die Breite variieren, während die Höhe gleich bleibt (da lokal Speicher pro Domäne ist).

Hier ist die link to jsfiddle

+1

Ich glaube nicht, dass es funktionieren wird. Ich möchte eine Entscheidung treffen, die auf einer Seite getroffen wird, um auf einer anderen Seite gelesen zu werden. – HerrSerker

+1

sessionStorage ist global für die Domäne, wenn Sie ein Element in sessionStorage auf Seite x setzen, ist es auf der Seite y zugänglich –

+0

@marty - sessionStorage ist nicht pro Seite, es ist pro Domäne –

2

Ich würde den Benutzer fragen, ob die Lage erinnern möchte. Wenn Sie das Verfallsdatum von Cookies nicht auf Server setzen. Sie geben dem Benutzer die Möglichkeit, die Benutzererfahrung auszuwählen.

können Sie versuchen anhängen Ereignis Onbeforeunload und einen Beitrag zum Server machen Cookies' Ablaufzeit zu ändern oder wenn Cookies nicht sichere Art ist dann löschen Sie es aus Java-Skript.

5

Meine Lösung für ein ähnliches Problem war die document.referrer in Kombination mit dem Cookie zu verwenden. Wenn der Benutzer auf Ihrer Site navigiert, verwenden Sie den Cookie weiterhin, wenn er existiert, andernfalls verfallen Sie oder ersetzen Sie den Cookie.

Das Problem ist immer noch da für, wenn der Benutzer legt den Browser im Hintergrund, während obwohl auf Ihrer Website.Wenn sie weiter surfen und nur einen Link auf Ihrer Website verwenden, wird der Cookie weiterhin verwendet.

4

Dieses Problem ist nicht auf mobile Geräte beschränkt. Sitzungscookies können auch auf einem Desktop-Browser "für immer" dauern, wenn ein Benutzer sich ständig dafür entscheidet, die vorherige Sitzung wiederherzustellen (das habe ich auf die harte Tour gelernt).

Eine clientseitige Lösung Sitzungen, eines Tages die folgenden zu begrenzen:

Set zwei Cookies:

  • a (Browser-) Session-Cookie und
  • ein Cookie, das in abläuft mitten in der Nacht des Benutzers (z. B. um 4 oder 5 Uhr), zwischen 2 Stunden und 26 Stunden ab dem Zeitpunkt, an dem es eingestellt wird (im Allgemeinen sollte es in einem Fenster zwischen x und x + 24 Stunden enden)

Wenn EITHER-Cookie fehlt, starten Sie eine neue Sitzung und setzen Sie beide zurück.

Um den zweiten Cookie zu setzen, können Sie Date.getTimezoneOffset() verwenden. Wenn Sie in der Lage sind, den Benutzer zuverlässig zu geolocaten, so dass Sie zumindest eine grobe Schätzung des Längengrads haben, können Sie mithilfe des Längengrads berechnen, wann die "Mitte der Nutzernacht" erwartet wird (1 Stunde entspricht 15 Grad) Längengrad). Zwei Möglichkeiten sind: nach IP-Adresse (zu wissen, dass das Land vielleicht nicht genug ist, in Ländern wie den USA benötigen Sie mindestens die staatliche Ebene), oder indem Sie die vom CDN bereitgestellten Informationen verwenden, wenn Sie eine verwenden.

Denken Sie daran, dass, wenn etwas nach einer Weile ablaufen muss (z. B. eine Sitzung auf dem Server), Sie sich nicht auf Cookies verlassen können, Sie müssen auch serverseitig nach Ablauf suchen.

1

Dies ist ein bisschen von schmutzig Vorschlag und keineswegs narrensicher - aber ich denke, es ist eine Erwähnung wert. Ich hatte noch nie ein Telefon, das im Leerlauf mit dem Internet verbunden war (alle schnitten ab, um den Akku zu schonen und so weiter) - und Mobilfunknetze recyceln IP-Adressen sehr schnell.

Es kann sich lohnen, die IP-Adresse in den Sitzungsdaten zu speichern und - möglicherweise in Verbindung mit einem letzten Zugriff Zeitstempel - die Sitzung zu zerstören/neu zu starten, wenn sich die IP-Adresse ändert?

Offensichtlich geht dies davon aus, dass der Client über das Mobilfunknetz und nicht über WLAN verbunden ist.