ajax redirect při vypršení doby přihlášení

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
tatyalien
Člen | 239
+
0
-

Ahoj,
v aplikaci používám komponenty, které využívají ajax. Když si uživatel nechá delší dobu otevřené okno a pak na něco klikne, je samozřejmě odhlášený a měl by se přihlásit, ale nedokážu tohle nějak odchytit. Zkoušel jsem dodat ve startup metodě (baseSecuredPresenter) přesměrování na přihlášení, ale nedaří se mě to pro ajaxové požadavky. Můžete mě trochu nasměrovat jak to udělat správně?

abstract class BaseSecuredPresenter extends BasePresenter
{

	public function startup()
	{
		parent::startup();
		if(!$this->user->isLoggedIn())
		{
			if ($this->user->getLogoutReason() === IUserStorage::INACTIVITY) {
				$this->flashMessage('Z důvodu delší nečinnosti jste byli automaticky odhlášeni.', 'warning');
			}
			$this->backlink = $this->storeRequest();
			if($this->isAjax())
            {
                //$this->getHttpResponse()->setCode(Response::S401_UNAUTHORIZED);
                //$this->presenter->sendResponse(new JsonResponse([]));
                //$this->presenter->sendResponse(new RedirectResponse($this->link(':Base:Sign:in'), Response::S401_UNAUTHORIZED));
                $this->presenter->sendResponse(new RedirectResponse('base.sign/in', Response::S401_UNAUTHORIZED));
            }
            else
            {
			    $this->redirect(':Base:Sign:in');
            }
		}
}

Editoval tatyalien (1. 9. 2017 20:46)

tatyalien
Člen | 239
+
0
-

To nikdo neřeší requesty po delší době neaktivity uživatele?

CZechBoY
Člen | 3608
+
0
-

Presmerovani je pres nette.ajax.js samo vyreseny.

tatyalien
Člen | 239
+
0
-

CZechBoY napsal(a):

Presmerovani je pres nette.ajax.js samo vyreseny.

Ahoj, otestováno. Máš pravdu… funguje, ale jakmile mám přilinkovaný ještě history.ajax.js tak se redirect neprovede.

		<script type="text/javascript" charset="utf-8" src="{$basePath}/www/js/others/netteForms.js"></script>
		<script type="text/javascript" charset="utf-8" src="{$basePath}/www/js/others/netteAjax.js"></script>
		<script type="text/javascript" charset="utf-8" src="{$basePath}/www/js/others/history.ajax.js"></script>

Zkoušel jsem aktualizovat history.ajax.js ale výsledek stále neudělá redirect.
V tom scriptu co koukám je $.nette.ext(‚redirect‘, false); takže asi proto to nejede :(

Editoval tatyalien (2. 9. 2017 20:02)

CZechBoY
Člen | 3608
+
0
-

Zkus ho znovu zapnout nebo upravit rozsireni.

tatyalien
Člen | 239
+
0
-

Nerad bych se vrtal v rozšíření od Dobeše, zkusím mu písknout. On to tam vypíná k vůli nějaké funkčnosti, ale nevím proč.

tatyalien
Člen | 239
+
+4
-

Pokud by to někdo hledal, tak lze to fixnout takto:

  1. vytvořit nette.ext a přilinkovat do template, například:
(function($, undefined) {

    // support $this->redirect()
    $.nette.ext('hardRedirect', {
        success: function (payload) {
            if (payload.hardRedirect) {
                window.location.href = payload.hardRedirect;
                return false;
            }
        }
    });

})(jQuery);
  1. secured presenter:
abstract class BaseSecuredPresenter extends BasePresenter
{

    public function startup()
    {
        parent::startup();
        if(!$this->user->isLoggedIn())
        {
            if ($this->user->getLogoutReason() === IUserStorage::INACTIVITY) {
                $this->flashMessage('Z důvodu delší nečinnosti jste byli automaticky odhlášeni.', 'warning');
            }
 			$this->backlink = $this->storeRequest();
			if($this->isAjax())
			{
				$args = [];
				$args[self::FLASH_KEY] = $this->getParameter(self::FLASH_KEY);
				$this->payload->hardRedirect = $this->link(':Base:Sign:in', $args);
				$this->sendPayload();
			}
			else
			{
				$this->redirect(':Base:Sign:in');
			}
        }
}

Editoval tatyalien (15. 9. 2017 8:08)