2011-08-25 75 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