Flash-сообщения ненадежны, как исправить это дело?

Никто не ответил на этот вопрос несколько дней назад, поэтому я попытаюсь объяснить его по-другому. Это мешает мне работать над моим проектом.

В PHP вы можете хранить сообщения обратной связи в $ _SESSION, такие как $ _SESSION [‘login’] = «failed», которые могут быть возвращены пользователю после перенаправления. Это так называемые флеш-сообщения. Проблема в том, что PHP не знает, какое флэш-сообщение принадлежит какому-либо браузеру TAB. Вот пример:

  1. Пользователь переходит на сайт website.com/UploadPhoto на двух вкладках и выбирает одну фотографию для загрузки на каждой. Он нажимает «отправить» на обоих одновременно.
  2. Первая фотография обрабатывается формой и успешно загружается. Флэш-сообщение сохраняется как «успех!», И перенаправление начинается обратно на website.com/myPhotos/, чтобы пользователь мог загрузить больше фотографий, а также увидеть отображаемое флеш-сообщение об успехе — но здесь есть загвоздка, для которой пользователь был случайно выбран объявление, и ему потребуется 10 секунд, чтобы быть перенаправленным на страницу с его фотографией.
  3. Второе изображение теперь обрабатывается формой, но оно содержит ошибку и получает флэш-сообщение «ошибка: файл слишком большой», и перенаправление также продолжается на website.com/UploadPhoto.

    Что происходит сейчас, так это то, что вторая картинка, которая была загружена после первой, перенаправляется первой с сообщением: Успех! Он похитил первое сообщение, потому что оно было перенаправлено раньше. Затем, после 10 секунд рекламы, случай с изображением 1 перенаправляется с сообщением «файл слишком большой», потому что он поступил позже.

    Как вы можете предотвратить это?
    Я действительно надеюсь, что кто-то может дать мне некоторое представление, потому что я застрял в своем проекте из-за этого

0

Решение

Когда браузер выполняет запрос к определенному URL, он отправляет все файлы cookie, которые соответствуют домену и пути. Неважно, в каком окне или вкладке вы находитесь, это поведение всегда одинаково.

Есть несколько решений вашей проблемы:

Javascript / Ajax

На мой взгляд, самый простой способ, потому что есть много хороших библиотек javascript для управления загрузкой файлов через запросы XHR (ajax). Один мне нравится Загрузка файла jQuery.

В этом случае вам не понадобятся флэш-сообщения, вы можете просто поместить всю необходимую информацию в ответ на запрос XHR.

Укажите идентификатор для окна / вкладки

Йенс-Андре Кох дал хороший ответ о том, как это работает.

Отдельные сеансы

Если вам нужна полная поддержка отдельных сеансов для каждого окна / вкладки, вы не можете полагаться на то, что идентификатор сеанса хранится в файле cookie. Это, однако, будет означать, что пользователь должен войти в каждое окно / вкладку. Я объясню, как это работает подробно:

  • Пользователь посещает https://my.domain.com/ и предоставляется форма для входа в систему.
  • Он / она заполняет эту форму и нажимает кнопку отправки. Браузер выполняет запрос POST.
  • Сервер получает этот запрос, видит, что введенные данные верны, сохраняет зарегистрированное состояние в новом сеансе и отправляет 30-кратный ответ, содержащий URL-адрес. https://my.domain.com/upload/?session_name=session_id
  • Браузер реагирует на этот ответ, выполняя запрос GET к этому URL.
  • Сервер распознает идентификатор сеанса в URL и возобновляет этот сеанс, видит журналы в состоянии и отправляет ответ 200, содержащий форму для загрузки файла. Атрибут action элемента формы должен содержать идентификатор сеанса (https://my.domain.com/upload/?session_name=session_id).
  • Пользователь заполняет форму загрузки и нажимает кнопку отправки. Браузер выполняет запрос POST.
  • Сервер получает запрос и обрабатывает загрузку файла. 2 вещи могут произойти сейчас:
    1. Неудача:
      • Сервер отправляет ответ 200, содержащий сообщение об ошибке и оригинальную форму загрузки файла. Пользователь может попробовать еще раз.
    2. Успех:
      • Сервер сохраняет флэш-сообщение об успехе в сеансе и отправляет 30-кратный ответ, содержащий URL http://my.domain.com/upload/?session_name=session_id.
      • Браузер реагирует на этот ответ, выполняя запрос GET к этому URL.
      • Сервер получает запрос, видит флэш-сообщение в сеансе и отправляет ответ 200, содержащий флэш-сообщение (которое затем удаляется из сеанса) вместе с формой загрузки файла.

Вы должны получить суть сейчас: каждый URL, возвращаемый сервером, должен содержать идентификатор сеанса. Вы больше не полагаетесь на идентификатор сеанса в файле cookie (фактически целесообразно отключить отправку файла cookie, содержащего идентификатор сеанса в PHP).

Я также очень четко говорил о запросах / ответах, чтобы лучше показать, как на самом деле работает протокол http.

1

Другие решения

Ваши flash-сообщения не имеют представления, когда и по какой причине они должны показываться.
Когда загрузка изображения завершится, вы можете показать флэш-сообщение в зависимости от идентификатора изображения.

Чтобы получить сообщение типа «Успех: изображение 1 из вкладки A загружено», необходимо добавить в сеанс дополнительные данные, например идентификатор изображения и, возможно, состояние процесса загрузки. Если вам действительно нужен идентификатор вкладки, добавьте его тоже.

  • $_SESSION['flashmessages']['image_uploads'][$id]['state'] = "uploading";
  • $_SESSION['flashmessages']['image_uploads'][$id]['state'] = "finished";

    if(array_key_exists('image_uploads', $_SESSION['flashmessages']) === true)
    {
    foreach($_SESSION['flashmessages']['image_uploads'] as $image => $values) {
    if($values['state'] === 'finished') {
    // output flashmessage
    echo 'Success: Image ' . $image . ' was uploaded.';
    // unset this flashmessage
    unset($_SESSION['flashmessages']['image_uploads'][$id]);
    }
    }
    }
    
0

По вопросам рекламы [email protected]