Refresh stránky po automatickém odhlášení

jedlicka
Člen | 70
+
0
-

Ahoj,

mám nastavené session na 2h. Pokud není uživatel po dobu 2h aktivní, tak se automaticky provede odhlášení z aplikace.

Problém ale je ten, že pokud uživatel neaktualizuje stránku, tak se to nedozví, že byl odhlášen (a občas se stane, že po automatickém odhlášení pokračuje v editaci formuláře, ale zjistí to až ten formulář zkusí odeslat). Jde mi tedy o to, jak udělat, aby se mu po automatickém odhlášení, aktualizovala stránka a jasně viděl, že byl odhlášen.

Děkuji za rady.

Martin

Kamil Valenta
Člen | 815
+
+2
-

JavaScriptem. Který si bude počítat čas od načtení (pozor, nulovat při ajaxu).
Nebo si před odhlášením uchovat request a po přihlášení udělat jeho restore, čímž zachováš i odeslaný POST.

Pepino
Člen | 256
+
+1
-

Můžeš JS nastavit timer který např. co minutu zavolá na ajax request který čekne jestli jsi přihlášený.. Pokud ne přesměruješ stránku.

dakur
Člen | 493
+
0
-

Pepino napsal(a):

Můžeš JS nastavit timer který např. co minutu zavolá na ajax request který čekne jestli jsi přihlášený.. Pokud ne přesměruješ stránku.

Tohle podle mě session akorát prodlouží, protože i ten async request je posílán s danou session cookie. Nešlo by se spíš v JS ptát, jestli session cookie už neexpirovala?

Jinak ale ten redirect s backlinkem mi přijde dobrý, backlink ukládá i POST, takže o text z formuláře uživatel nepřijde.

Editoval dakur (1. 6. 2022 16:02)

Pepino
Člen | 256
+
0
-

@dakur nemusí se volat aplikace, ale nějaká extra stránka.

dakur
Člen | 493
+
+1
-

Pepino napsal(a):

@dakur nemusí se volat aplikace, ale nějaká extra stránka.

Pak si ale session id uživatele musíš poslat v request body a nějak to dohledat.. Je to možnost. 🙂

Editoval dakur (1. 6. 2022 16:03)

Kcko
Člen | 468
+
+1
-

Mám to v jednom starším webu řešené tak jak se zmínil @Pepino

v adminku v @layout.latte
 {if $presenter->getName() != 'Admin:Sign'}
   <div id="inactivity-logout" data-time="{= 1000 * 60 * 10}" data-url="{plink Sign:inactivityOut}"></div>
 {/if}
JS
	if ($('#inactivity-logout').length) {

		var logoutInterval;
		var debounce;

		var logout = function () {
		  console.log('spousti se timeout na odhlaseni');
		  logoutInterval = setTimeout(function () {
			console.log('ODHLASENI');
			window.location.href = $('#inactivity-logout').data('url');
		  }, $('#inactivity-logout').data('time'));
		};

		logout();

		$(document).on('keyup mousemove paste change click focus scroll', function (e) {
		  clearTimeout(debounce);
		  clearTimeout(logoutInterval);
		  console.log('clear');
		  debounce = setTimeout(function () {
			logout();
		  }, 500);
		});
	}

Odhlášení

	public function actionInactivityOut()
	{
		$this->getUser()->logout(TRUE);
		$this->flashMessage('Byl(a) jste odhlášen(a) z bezpečnostního důvodu díky časové inaktivitě.');
		$this->redirect('in');
	}
Pepino
Člen | 256
+
0
-

dakur napsal(a):

Pepino napsal(a):

@dakur nemusí se volat aplikace, ale nějaká extra stránka.

Pak si ale session id uživatele musíš poslat v request body a nějak to dohledat.. Je to možnost. 🙂

Na jednom starším webu jsem to vytahoval ze session

$_SESSION['__NF']['DATA']['Nette.Http.UserStorage']['authenticated']

ale nevím jak to funguje na jaké verzi.

Editoval Pepino (1. 6. 2022 19:05)

jedlicka
Člen | 70
+
0
-

@Pepino @Kcko super, děkuju moc.