Answer the question
In order to leave comments, you need to log in
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
Осуществил через Yii::$app->session с некоторыми костылями - заработало. Спасибо за помощь, господа!
1. мало кода, как для 2-х страниц
2. Почему не использовать yii если Вы его используете?
и
3. Вы избавились от CSRF token да еще и при авторизации - это впринципе дыра в защите, но кроме этого Ваш экшен может не работать. Так как по умолчанию в yii2 все post запросы проходят проверку CSRF. Если Вы посмотрите дебаг, там скорее всего есть инфа, что post запрос не прошел проверку. Поэтому и не работает ничего.
попробуйте в init контроллера сделать примерно следующее, чтобы проверить гипотезу о csrf
public function init()
{
parent::init();
$this->controller->enableCsrfValidation = false;
Yii::$app->response->format = Response::FORMAT_JSON;
}
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 questionAsk a Question
731 491 924 answers to any question