2011-08-25 61 views
0

如何檢查用戶是否已經離開我的登錄表單?沒有登錄,但實際上離開它?用戶離開時CakePHP刪除會話

因爲我想刪除Auth.redirect會話,如果他們選擇不登錄,以便他們稍後返回,他們不會被帶到他們以前的會話!

所以基本上運行以下命令:

$this->Session->delete('Auth.redirect');

我想某種檢查中,知道當用戶從登錄表單提到並刪除會話auth.redirect的AppController的???

或更好的檢查當前頁面是否是登錄表單,如果不是,則刪除會話!

,併爲那些有興趣,這是我的登錄方法目前的樣子:

function login() 
{ 
     if(!(empty($this->data)) && $this->Auth->user()) 
     { 
      $back_to = $this->Session->read('back_to'); 

      $auth_redirect = $this->Session->read('Auth.redirect'); 

      if($auth_redirect) 
      { 
       $this->redirect($auth_redirect, null, true); 
      } 
      else if($back_to) 
      { 
       $this->redirect($back_to, null, true); 
      } 
      else 
      { 
       $this->redirect($this->Auth->redirect(), null, true); 
      } 
     } 
     else 
     { 
      $this->Session->write('back_to', $this->referer()); 
     } 
} 

感謝

+0

@ Ethan的答案是正確的,當用戶離開* *你的網站,你可以不知道。我認爲你想避免的是一個非常狹窄的情況:用戶進入你的站點,點擊登錄,離開頁面,稍後回到登錄頁面,登錄,然後重定向到他們以前的位置。就我個人而言,我對這種行爲完全沒問題,並且很多人不會注意到或關心它。而且,'Auth。重定向「值不會永遠存在。會議最終會過期,通常會在幾個小時內完成,這使得這種邊緣案例更加罕見。 – deceze

+0

如何檢查他們是否正在查看登錄表單,如果不是,則刪除會話,以便它只存在於登錄表單中,並在重定向後存在,然後如果他們改變了主意,它將被取消,而back_to會被用來代替。你能幫忙嗎?乾杯 – Cameron

回答

0
 if($this->here != '/admin/login') 
     { 
      $this->Session->delete('Auth.redirect'); 
     } 

或本:

if($this->here != Router::url(array('admin'=>true,'controller'=>'users','action'=>'login'))) 
      { 
       $this->Session->delete('Auth.redirect'); 
      } 
+0

'$ this-> here!='/ admin/login''將很容易中斷。 '$ this-> here'包含整個URL路徑,而不僅僅是相對於應用程序根目錄。即如果您已將應用安裝在子目錄中,它可能包含'/ apache/user/cake/myapp/admin/login'。此外,你不應該發佈這個回答你的問題(或者是?)。 – deceze

+0

我怎麼能比較它與控制器行動呢?我可以這樣做:'$ this-> here!= array('controller'=>'users','action'=>'login')'??? – Cameron

+0

'$ this-> params ['controller'] == $ this-> name && $ this-> params ['action'] == $ this-> action' – deceze

1

我不熟悉CakePHP的,但你的問題聽起來有點怪我。您正在談論PHP,一種服務器端腳本語言。一個PHP腳本只有在請求進入時纔會被執行(如果有什麼我還不知道的東西,請糾正我)。

因此,當用戶調用登錄頁面時,腳本就會被執行。現在考慮以下內容:在登錄頁面加載完成後,用戶使用登錄頁面關閉瀏覽器選項卡。這不會觸發請求,因此不可能通知服務器該操作。

也許CakePHP可以做這樣的神奇事情,但我認爲我們正在談論無狀態的HTTP,所以我無法想象如何實現類似的東西。

0

您可以向最後收到用戶請求的會話添加時間戳。例如,在AppController::beforeFilter中,只需添加$this->Session->write('lastSeen', time())即可。然後,您可以檢查用戶最後一次打開任何頁面所用的時間,如果間隔太長,則丟棄值Auth.redirect

這基本上與過期會話一樣,只是以更受控制的方式。如果你想計算一個用戶簡單地把你的頁面顯示在他的屏幕上的時間也是「活動」,你可以使用一些Javascript AJAX來不斷向服務器發送請求信號「我活躍!」

雖然這對於很少的好處都是相當多的工作。 HTTP是無狀態的,不允許您輕鬆跟蹤用戶,期間。實際上,追蹤用戶是否「積極」地看着你的頁面,或者不會造成巨大的開銷,在這種情況下,對於你想要使用它的非常狹窄的目的來說,這似乎是錯誤的努力。

+0

如果當前頁面不是登錄表單,我寧願刪除會話。你能幫忙嗎?歡呼 – Cameron

+1

@Cameron這基本上意味着你可以關閉AuthComponent的自動重定向功能。 – deceze

+0

我把它關掉了!但我仍然使用該會話將用戶發回他們來自的位置。 – Cameron