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?
Even voor je gezocht en deze gevonden.

https://www.chromestatus.com/feature/4664843055398912

[size=xsmall]Toevoeging op 22/06/2021 01:46:52:[/size]

Oooh ... zie nu dat dat gewoon de link is die in jouw post staat hahaha :D *facepalm*

Anyhow, lijkt dus by design te zijn.

"Chrome now disallows synchronous XHR during page dismissal when the page is being navigated away from or closed by the user."
Bedankt Ozzie voor het meedenken!

Na wat zoekwerk blijkt dat de events onbeforeunload en unload onbetrouwbaar zijn, ofwel dat het niet overal goed werkt.
Volgens https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event
The beforeunload event suffers from the same problems as the unload event.
Especially on mobile, the beforeunload event is not reliably fired.

En bij de documentatie over unload staat:
Developers should avoid using this event.

En bij de documentatie over XmlHttpRequest staat:
synchronous requests on the main thread have been deprecated due to the negative effects to the user experience.


Dus achteraf bezien was mijn oplossing van automatisch uitloggen bij het sluiten van de pagina al een tijdje gedeprecieerd, ook bij Firefox.

Kijkend naar een alternatief wordt via MDN verwezen naar de Page Lifecycle API bij Google, in het schema staan de pagehide en visibilitychange events als alternatief. Maar pagehide werkt in mijn geval ook niet in Edge. :-/

Dan zie ik nog maar een enkel alternatief, dat openstaande pagina's (gechecked via visibilitychange event) de sessie elke 5 minuten levend houden, gecombineerd met een verlooptijd voor sessies van 10 tot 15 minuten.

Gek genoeg had ik dit alternatief eerder juist vervangen voor automatisch uitloggen bij een beforeunload event, om veel onnodige HTTP-requests te voorkomen, maar kennelijk is dat juist weer geen probleem voor webkit.

Dus ik hoop vurig dat iemand nog een beter idee heeft?
Ik heb er zelf geen ervaring mee, maar ik meen hier op het forum wel eens voorbij te zien hebben gekomen dat gebruik wordt gemaakt van (ik vermoed) AJAX. Bijv. om de minuut een ajax-call die in de database de huidige tijd wegschrijft bij een user. Op het moment dat het venster sluit, wordt er geen ajax-call meer uitgevoerd. Als in de database de tijd dus ouder is dan 1 minuut, is de gebruiker uitgelogd.

Waarom moet een gebruiker trouwens automatisch worden uitgelogd? Bij inactiviteit verloopt toch zijn/haar sessie?
Wat er nu gebeurt is dat als als je Edge afsluit en opnieuw start, je nog steeds ingelogd bent.
Edge bewaart de cookie netjes vanwege de Max-Age eigenschap. Maar het staat heel raar dat je nog bent ingelogd, wat als je even iemand anders achter je computer laat?

Toegegeven, ik heb het nagezocht in de ISO 27k en de NEN-7510, vanzelf uitloggen is geen verplichting.
Maar een gewonbe Fritz!Box doet het ook, dan moet het mij toch ook lukken...?
>> Wat er nu gebeurt is dat als als je Edge afsluit en opnieuw start, je nog steeds ingelogd bent.
Edge bewaart de cookie netjes vanwege de Max-Age eigenschap.

Geldt dat ook voor een sessie-cookie? Ik kan het me haast niet voorstellen ...
Helaas wel. Max-Age staat op een aantal minuten, dat wordt bewaard.
Ik had ook Max-Age=0 kunnen doen, dan zou die moeten worden bewaard tot de browser sluit. Maar dan wordt die cookie ook niet eerder vanzelf opgeruimd.
Stel max-age gewoon eens niet in? Wat doet ie dan?
Dan blijf je in Edge ingelogd als je de tab sluit en opnieuw opent, maar je bent uitgelogd als je heel Edge afsluit. Nog steeds niet helemaal wat ik in gedachten had.
Ik zit nu op het spoor om de sessie ping maar weer in het leven te roepen, zodat je (eventueel) automatisch ingelogd blijft. Dat is zowieso nodig voor monitoring, je wilt ook niet dat ze elk kwartier ergens op moeten klikken.
En bij het sluiten van het venster mag een XmlHttpRequest misschien niet meer, maar ik kan dan misschien nog wel de cookie verwijderen.
>> Dan blijf je in Edge ingelogd als je de tab sluit en opnieuw opent, maar je bent uitgelogd als je heel Edge afsluit. Nog steeds niet helemaal wat ik in gedachten had.

Maar dit is normaal gedrag hoor ... als je een tab afsluit en de browser staat nog open, dan blijf je gewoon ingelogd. Als je de browser zelf afsluit, dan log je uit. Dit geldt uiteraard niet als je zelf op de 'uitloggen' link klikt.

>> Ik zit nu op het spoor om de sessie ping maar weer in het leven te roepen, zodat je (eventueel) automatisch ingelogd blijft.

Ik snap helemaal niet wat je hiermee bedoelt. Je kunt instellen hoe lang een SESSION in leven blijft. Als er in de tussentijd geen activiteit plaatsvindt, dan verloopt de sessie na die tijd en ben je dus uitgelogd.
Ja sorry, dat was een beetje kort inderdaad, maar de Niet Persoonlijke Accounts moeten ingelogd blijven, voor onder meer de grote overzichtschermen. Die kunnen worden aangezwengeld door iemand met een NPA (=sleutel), maar daarna wordt er normaal gesproken de hele dag niet meer naar omgezien. Vandaar.

Overigens, als ik bij de Fritz!Box de tab sluit en de browser niet, ben ik wel uitgelogd. Dat wil ik ook graag :-)

Reageren