7

返回引用页面时遇到问题:

first url: http://site.com/venue/apartments/1564/venue-name
referer url: null

在这个页面我可以编辑里面的东西,所以我有一个login按钮可以进入登录页面,登录成功后我想回到first url.

second url: http://site.com/users/login
referer url: http://site.com/venue/apartments/1564/venue-name

当我尝试登录时,由于 CakePHP 操作规则,我必须刷新登录页面以检查凭据,problem从这里开始:

third url: http://site.com/users/login
referer url: http://site.com/users/login

通过刷新页面,并检查控制器login操作中的凭据,users我得到了与以前相同的页面,现在我无法返回first url.

我通过在 AppController 中设置会话变量尝试了一些解决方案,该变量检查我是否不在login操作页面中并执行以下操作:

AppController.php

public function beforeFilter () {
    $this->setRedirect();
}

public function setRedirect () {
    if ($this->request->params['controller'] != 'users' && $this->request->params['action'] != 'login') {
        $this->Session->write('redir', array('controller'=>$this->request->params['controller'], 'action'=>$this->request->params['action'], implode($this->request->params['pass'], '/')));
    }
}

通过测试会话变量,debug($this->Session->write('redir'));一切似乎都很完美,直到我开始login行动:

UsersController.php

public function login () {
    if ($this->request->is ('post')){
        if ($this->Auth->login()) {
            $redir = $this->Session->read('redir');
            if (!empty($redir)) {
                $this->redirect ($redir);
            } else {
                $this->redirect ($this->Auth->redirect());
            }
        }
    }
}

这样做会破坏应用程序,如果我debug($redir);得到:

array(
    'controller' => 'js',
    'action' => 'jquery',
    (int) 0 => 'plugin/jquery.validata.1.7.min' // just a jquery plugin loaded in default.ctp
)

代替

array(
    'controller' => 'venue',
    'action' => 'apartments',
    (int) 0 => '1564/venue-name'
)

如果我debug($redir);在整个站点的任何其他视图中,一切正常,我得到正确的数据。

我想在某种会话保护例程中$this->Auth->login()采取行动,但这对我来说完全是无稽之谈。

如何将登录的用户重定向到不是login查看页面的最后一页?

4

3 回答 3

15

你试过这个:$this->redirect(Controller::referer());

我必须重新阅读你的整个问题才能确定,但​​这也应该有效:$this->redirect( $this->referer() );

于 2013-05-02T15:42:09.783 回答
11

我使用会话来保持上次访问的 url,如果登录成功,用户将被重定向到它。

首先在 AppController.php 中,我将 url 保存在会话中,登录和注销操作除外:

public function beforeFilter() {
    $url = Router::url(NULL, true); //complete url
    if (!preg_match('/login|logout/i', $url)){
        $this->Session->write('lastUrl', $url);
    }
}

在登录操作的 UserController.php 中,我有以下代码:

public function login() {
    if ($this->request->is('post')) {
        if ($this->Auth->login()) {
            if ($this->Session->read('lastUrl')){
                $this->redirect($this->Session->read('lastUrl'));
                exit;
            }else{
                return $this->redirect($this->Auth->redirect());
            }
        }
        $this->Session->setFlash(__('Invalid username or password'));
    }
}
于 2013-10-10T17:55:55.550 回答
0

我这样做是这样的:

public function login() {
    if ($this->request->is('post')) {
        if ($this->Auth->login()) {
            $this->redirect($this->Session->read('referer'));
        } else {
            $this->Session->setFlash(__('Não foi possível efetuar o login. Usuário ou senha inválidos'), 'default', array('class' => 'alert alert-danger'));
        }
    } else {
         $this->Session->write('referer', $this->referer());
    }
}
于 2015-11-26T11:34:18.160 回答