Быстрое нажатие на ссылки вызывает выход из системы (блокировка сеанса?) - PullRequest
0 голосов
/ 13 сентября 2018

Проблема:

При входе в систему я быстро щелкаю, чтобы открыть несколько ссылок на новых вкладках, первая работает нормально, но последующие не могут прочитать user из сеанса и заставляют приложение думать «нет пользователя». данные = нет доступа, перенаправить на вход ".

Мне сказали, что это может быть связано с блокировкой сеанса PHP. Идея в том, что первая страница загружается, и, таким образом, читает сессию. Прежде чем это будет сделано, следующий пытается прочитать сессию, но он все еще заблокирован первым.

Это также происходит, если просто щелкнуть одну ссылку, а затем щелкнуть другую ссылку. Поскольку первая ссылка все еще попадает на сервер, вызывая блокировку сеанса, поэтому, когда браузер пытается перевести вас на вторую, он не может прочитать user и считает, что вы не вошли в систему.

Это кажется очень странным поведением по умолчанию, и я должен представить, что кто-то придумал достойное решение, кроме "просто не открывайте несколько вкладок" и "не передумайте, нажимая ссылки".

Этого не происходит в моем приложении CakePHP 2.x PHP 5.x, но это происходит в моем приложении CakePHP 3.x PHP 7.x.

Одно из предложенных решений:

Мне сказали попробовать Redis. Хотя это звучит как приличное решение (Redis не блокирует сеанс), оно удаляет полезный аспект блокировки сеанса и, похоже, не работает. Даже после настройки приложения CakePHP 3 на использование redis для сеансов и проверки его записи данных сеанса в redis проблема все еще возникала.

Вопросы:

Каков стандартный метод решения этой проблемы? Есть ли в каждом приложении CakePHP 3.x эта ошибка по умолчанию?

Примечание / Дополнительный второстепенный вопрос:

Я заметил, что значение cookie, которое Cake хранит в разделе «CAKE», изменяется при большинстве загрузок страницы. Значение является ключом сеанса (минус префикс). Означает ли это, что он устанавливает новый сеанс при каждой загрузке страницы? Если так, есть ли причина для этого?

1 Ответ

0 голосов
/ 13 сентября 2018

Это не то, как работает блокировка сеанса в PHP, заблокированный сеанс будет блокировать выполнение скрипта до тех пор, пока сеанс не будет разблокирован, он не продолжится и оставит вас без доступа к сеансу или пустая сессия.

Если вы видите новый идентификатор сеанса в каждом запросе, то может быть проблемой (или ее симптомом), то есть последующие запросы с использованием уже признанных недействительными идентификаторов сеанса, которые наверняка оставят вас с пустой сеанс, т. е. вы выйдете из системы.

Сеансы обычно восстанавливаются довольно редко, например, при входе / выходе (чтобы избежать атак повторного воспроизведения) или по истечении времени ожидания сеанса. В качестве отправной точки проверьте конфигурацию тайм-аута / времени жизни сеанса (\Cake\Network\Session::$_lifetime), а также попробуйте точку останова в \Cake\Network\Session::renew(), чтобы проверить, вызывается ли она неожиданно и откуда.

...