2011-11-23 1 views
1

Я использую AJAX в своих приложениях для веб-приложений, таких как поиск, но если пользователь вышел из системы, функция ajax ничего не возвращает, потому что перенаправление (от действия «поиск» до действия «login») не обработано правильно.перенаправление CakePHP 2 AJAX

Возможно ли переопределить метод 'redirect' в AppController для рендеринга правильного действия при перенаправлении hapend в вызове AJAX?

Спасибо, Себастьен

ответ

2

Я думаю, что вам лучше всего будет установить вам АЯКС позвонить правильно реагировать на недопустимый ответ. Поскольку это, кажется, важная часть вашего приложения, я бы передал переменную loggedin с каждым запросом ajax, поэтому клиент может сказать, как только пользователь будет выведен из системы.

Update

В случае, если вы хотите сохранить пользователь вошел в системе, вы просто должны поставить вошедшими в/проверке печенья в чем-то, как ваш AppController::beforeFilter(), что запускаемый при каждом запросе. например:

public function beforeFilter() { 
    if($this->Auth->user() { 
      // USer is logged in, it's all gravy 
    } else { 
     // User is not logged in, try to log them in 
     $userData = $this->Cookie->read('User'); 
    if(!empty($userData)) { 
       // Function that grabs info from cookie and logs in user 
     } 
    } 
} 

Таким образом, не будет никакого редиректа, как пользователь будет зарегистрирован в системе до тех пор, как они есть печенье.

+0

Но я не хочу, чтобы пользователь должен был снова подключиться, у меня есть функция автоматического входа в систему с информацией о файлах cookie. Я хочу, чтобы при вызове AJAX CakePHP проверял, зарегистрирован ли пользователь и автоматически подключается, если нет. –

+1

@ Sébastien см. Мое обновление. – Dunhamzzz

+0

Хорошо, спасибо за это. Но знайте, что если «незарегистрированный пользователь» находится на общедоступной странице и запускает событие AJAX, для которого требуется вход в систему, в этом методе будет перенаправление на страницу loggin (для вызова без аякса). Таким образом, возврат AJAX будет пустым (без ошибок); как не разбить метод и сделать «псевдо-перенаправление», чтобы страница входа в систему была возвращена на вызов AJAX? –

0

Другой подход должен был бы позволить всем доступ к функции Ajax:

public function beforeFilter() { 
    $this->Auth->allow(array('my_ajax_method')); 
} 

А затем проверить, что пользователь аутентифицирован сам метод:

public function my_ajax_method() { 

    if (!$this->Auth->user()) { 
     //user not authenticated 
     $result = "requires auth"; 
    } 
    else { 
     // use is authenticated 
     // do stuff 
     $result = 'result of stuff'; 
    } 

    $this->set(compact('result')); 

} 

Вам нужно будет проверить результат вызова ajax в вашем javascript и действовать соответственно.

+0

Это невозможно, потому что многие из моих методов AJAX являются «стандартными» методами с условием «$ this-> request-> is ('Ajax'). –