2015-08-30 56 views
0

如何防止CakePHP 3.x在向服務器發送後臺Ajax調用時擴展我的用戶會話?我也使用jquery的$ .ajax()。如何防止CakePHP 3.0通過ajax請求延長會話超時?

我有一個每分鐘運行一次的setInterval來獲取一些用戶通知。我的應用程序是EHR,我需要保持嚴格的會話超時。我得到的通知JavaScript基本上只是讓我的會話無限,因爲ajax調用會延長會話。

幾周前我在CakePHP書中想到了一些關於這方面的東西,但我今天似乎無法找到它。

感謝, 達人

+0

那麼,當你說「_strict session timeout_」時,你的意思是什麼?從你的問題的標題可以想到,你只是希望後臺的AJAX請求不會影響超時,而用戶的前臺活動_should_擴展會話? – ndm

+0

嚴格的是,會話必須在10分鐘沒有活動後超時。所以後臺Ajax請求不應該擴展會話。現在,我的Ajax請求正在擴展在我的用例中不受歡迎的會話。 – darensipes

回答

2

一般來說,這是你需要處理你自己的,也就是實現自己的超時機制的東西。如何處理它,取決於。

您只想排除AJAX後臺活動,因此您需要訪問請求對象,並且您很可能希望儘早處理該請求。考慮到這些先決條件,我可能會使用調度過濾器,您可以根據當前請求是否爲AJAX請求來擴展超時,並在涉及任何控制器之前銷燬會話。

這裏有一個非常基本的,非常自我解釋的例子,它假設timeout選項值設置爲session configuration

的src /路由/過濾/ SessionTimeoutFilter.php

namespace App\Routing\Filter; 

use Cake\Core\Configure; 
use Cake\Event\Event; 
use Cake\Routing\DispatcherFilter; 

class SessionTimeoutFilter extends DispatcherFilter 
{ 
    public function beforeDispatch(Event $event) 
    { 
     /* @var $request \Cake\Network\Request */ 
     $request = $event->data['request']; 

     $session = $request->session(); 
     $lastAccess = $session->read('SessionTimeoutFilter.lastAccess'); 

     if (
      $lastAccess !== null && 
      time() - $lastAccess > Configure::read('Session.timeout') * 60 
     ) { 
      $request->session()->destroy(); 
     } 

     if (!$request->is('ajax')) { 
      $session->write('SessionTimeoutFilter.lastAccess', time()); 
     } 
    } 
} 

的src /配置/ bootstrap.php中

DispatcherFactory::add('SessionTimeout'); 

根據您的具體需要,你當然可以發生類似的代碼幾乎可以在你的應用程序的任何地方訪問請求對象。

+0

完美工作。我沒有添加另一個檢查來查看是否設置了查詢字符串參數,以便我可以允許ajax ping請求來擴展會話。我有一些會話監控JavaScript,如果它們在表單頁面上處於活動狀態,它將擴展會話。如果他們在頁面上留下未提交的作品,我會有一個特殊的彈出窗口,允許他們重新進行身份驗證,這樣他們就不會失去工作。我有一個用戶通知腳本,用於檢查基本上延長會話的新通知,這個通知不允許X分鐘後的自動註銷工作。 – darensipes