I
I
Ivan Kolesnik2016-09-08 10:13:36
Yii
Ivan Kolesnik, 2016-09-08 10:13:36

The trouble is in the AJAX + SESSION bundle, what's stopping you?

Если коротко и популярно:
Есть проект под Yii2. Соответственно, сам фреймворк автоматом запускает сессию перед инициализацией контролелров. Есть страница, с которой AJAX-запрос отправляется на страницу #2, где данные обрабатываются и устанавливается сессия с определенным содержимым. После того, как первая страница получает ответ, она AJAXом же обновляет часть страницы, использующую сессию, установленную на странице #2. Но, увы, сессия пустая. Дебаггер говорит, что сессия была успешно утановлена на второй странице, она спокойно выводилась в отладочной информации с теми данными, которые были в нее "завернуты". Но. Первая страница в упор не видит ее. Даже после обновления - массив сессий пуст.

Есть предложения/предположения, можно ли вообще такое вершить? Благодарю.
----------------------
UPD: Потребовали код, привожу. AJAX на первой странице:

$.post(
            '/ajax/login',
            {
                email: $('#auth_mail').val(),
                password: $('#auth_pass').val()
            }, function (data) {
                      // Тут я вершу свои грязные делишки после получения ответа.
            }
        );


Контроллер, получающий сие чудо (упрощен, то, что писал в модели сразу перенес сюда, дабы сэкономить время):

public function actionLogin()
    {
        $user = User::findOne(['email' => $_POST['email']]); // ActiveRecord Query
        if(!$user)
            return false;

        return $user->password === md5($_POST['password']) ? $_SESSION['auth'] = true : false;
    }

Answer the question

In order to leave comments, you need to log in

4 answer(s)
Иван Колесник, 2016-09-08
@dart_kinselok

Осуществил через Yii::$app->session с некоторыми костылями - заработало. Спасибо за помощь, господа!

Максим Тимофеев, 2016-09-08
@webinar Куратор тега Yii

1. мало кода, как для 2-х страниц
2. Почему не использовать yii если Вы его используете?
и
3. Вы избавились от CSRF token да еще и при авторизации - это впринципе дыра в защите, но кроме этого Ваш экшен может не работать. Так как по умолчанию в yii2 все post запросы проходят проверку CSRF. Если Вы посмотрите дебаг, там скорее всего есть инфа, что post запрос не прошел проверку. Поэтому и не работает ничего.

M
melnikov_m, 2016-09-08
@melnikov_m

попробуйте в init контроллера сделать примерно следующее, чтобы проверить гипотезу о csrf

public function init()
    {
        parent::init();
        $this->controller->enableCsrfValidation = false;
        Yii::$app->response->format = Response::FORMAT_JSON;
    }

The form is not necessarily JSON - choose any convenient for you

D
Dmitry, 2016-09-08
@slo_nik

Perhaps this should be done.

public function actionFirst()
{
   $session = Yii::$app->session;
   
   /* выполняете какие-то проверки и заносите данные в сессию */
  if(*****){
     $session->set('name', $this->name);
  }

}

public function actionSecond()
{
  $session = Yii::$app->session;
  
  return $session->get('name');
}

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question