Ik heb een simpele javascript-functie die het altijd deed, totdat de klant eindelijk overstapte naar Edge.
Het gekke is dat de functie wel gewoon werkt met Internet Explorer en Firefox.
window.addEventListener('unload', function() {
  let oXhr = new XMLHttpRequest();
  let sUrl = document.getElementById('xhrAfmelden').getAttribute('href');
  oXhr.open('POST', sUrl, false);  // sync, anders venter te vroeg gesloten
  oXhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
  formData.append('_CSRF_', sToken);
  oXhr.send();
});

De code moet er voor zorgen dat wanneer een venster gesloten wordt, de gebruiker automatisch wordt uitgelogd.
Het is nodig omdat bijna geen enkele gebruiker zichzelf uitlogt.
Maar sinds kort verschijnt hierdoor in mijn JS-foutlog vanuit Edge deze melding:

Uncaught NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'https://www.<mijnsite>.nl/';: Synchronous XHR in page dismissal. See https://www.chromestatus.com/feature/4664843055398912 for more details.

Het lijkt er op dat Edge (en evt. andere webkit browsers) de XMLHttpRequest niet afmaakt. Als ik de derde parameter van open() op true zet, werkt het soms wel met Edge, maar meestal niet. Wel krijg ik altijd de vraag van Edge 'Site opnieuw laden?.

Als ik het probeer met onbeforeunload gebeurt er helemaal niets, dus ik heb ff geen flauw idee hoe nu verder.
Weet iemand een oplossing?
>> Overigens, als ik bij de Fritz!Box de tab sluit en de browser niet, ben ik wel uitgelogd. Dat wil ik ook graag :-)

Doe iedere paar seconden een ajax check die de tijd wegschrijft... laat een cronjob lopen die iedere paar seconden checkt of de tijd nog actueel is (minder dan x seconden). Zo niet, log de betreffende user uit.
Dat patroon (noem ikzelf 'sessie pingen') ga ik volgen.

Helaas lukt het niet bij het sluiten van een tab om de HTTP cookie te verwijderen met JavaScript, omdat JS er niet bij mag... misschien moet ik sessie cookies maar helemaal afschaffen.

[size=xsmall]Toevoeging op 22/06/2021 15:18:37:[/size]

De reden dat JS er niet bij mag blijkt veiligheid, en dat is dus juist een reden om wél cookies te blijven gebruiken.

Maar het is toch wel een jungle, zonder standaard die alle browsers volgen.

Volgens MDN maakt het niet instellen van 'Expires' een cookie tot een sessie-cookie, die automatisch gesloten wordt als de browser gesloten wordt. Maar als ik alleen Max-Age instel, dan is het toch een sessie cookie maar wordt die niet door Edge gesloten bij het sluiten van de hele browser... en dat zuigt.

Max-Age=0 maakt dat de sessie cookie direct verloopt, dus de uitkomst is dat zowel Expires en Max-Age niet ingesteld moeten worden. Het enige nadeel is dat er een verouderde en dus ongeldige sessie ID in de browser bewaard blijft, daar moeten we maar mee leven.
Ik snap nog niet waarom je per se max-age instelt. Een sessie-cookie wordt verwijderd als je de browser sluit. Dat is toch wat je wil?
Ik stel nu geen Max-Age meer in, met dank aan jouw suggestie. Dat is wat ik wil.

Daarnaast moet ik nog maken dat als een tab gesloten wordt, de sessie gesloten wordt.
En dat NPA's hun sessie blijven verlengen, met die andere truuk.

Toch blijf ik het interessant vinden dat het de Fritz!Box wel lukt... wat zie ik over het hoofd?
Wat is de Fritz!Box? Dat is toch een modem/router?
FritzBox interface is een SPA, en die begint gewoon altijd met dat loginscherm. Elke keer als je de pagina reload moet je weer inloggen. De sessie bestaat dus alleen in de JS context, en verloopt daarom zodra je de tab sluit (of ververst).
Ah oké ... maar dan is er eigenlijk geen sprake van een sessie, maar enkel van een login die je bij elke pagina verversing moet invoeren.
Ideetje... als ik een JS token maak, om de tabs te identificeren, dan ben ik er ook.
Die tokens moeten dan wel apart van de CSRF-tokes, anders kan er geen aparte melding komen wanneer met de UI gerommeld wordt.

Het voordeel is dat je op elke tab apart kan inloggen met een verschillende acount, waardoor je op 1 PC met een enkele browser kan werken.
Als er een extra scherm aanhangt voor monitoring, kan die een tab (in apart venster) tonen, die de monitoringspagina laat zien met een niet-persoonlijke account. Op je normale scherm kan je dan tegelijk met je persoonlijke account blijven werken. Top idee, al zegt ik het zelf.
Ik ben benieuwd. Het idee is wel grappig. Vraag me alleen af of als je dan met een sessie werkt, de ene tab niet de sessie van de andere tab overneemt. Wellicht moeten je sessie-cookies dan per tab een andere naam krijgen. Het is wel een hoop gedoe ... maar het houdt je van de straat zullen we maar zeggen ;-)
Yesss, gelukt! Het bleek eenvoudiger dan gedacht.

De beginpagina van de SPA verzint een ID voor de tab, dat wordt meegestuurd in alle XHR-verzoeken, waarmee de juiste cookie gekozen kan worden in PHP voor de sessies.
Open je een nieuwe tab of pagina? Dan krijg je een nieuw ID voor de tab, waarmee je niet bent ingelogd.

Nu nog maken dat sessies automatisch in leven gehouden worden.

Reageren