Як запобігти повторну відправку повідомлення з форми

Багато починаючі веб-майстри задаються питанням: "Як запобігти повторну відправку даних з форми?". Дуже часто бачу такі питання на форумах. У цій статті розповім про легкому і правильному способі вирішення цієї проблеми.

Надіслати заново

Припустимо, ми робимо скрипт, який приймає дані з форми, передані методом POST. Скрипт дані прийняв, обробив і видав сторінку з результатом. Але якщо користувач надумає оновити сторінку в цей момент - він побачить повідомлення такого плану:

Щоб відобразити цю сторінку, Firefox повинен відправити інформацію, яка повторить будь раніше вироблене дію (наприклад, запит на пошук або онлайн-покупка).

І дві кнопки. Натискання на одну з них відправить дані повторно, що часто небажано. Натискання на другу не зробить оновлення сторінки. У будь-якому випадку, користувачеві не добре від такого повідомлення. Користувачі взагалі не дуже люблять всякі раптово вискакують віконця.

Для початку, покажу скрипт, який ми будемо допрацьовувати.

Можете відправити форму один раз, а потім натиснути Ctrl + R і побачити нещасливе вікно. Давайте від нього позбавлятися.

Запобігання повторного відправлення форми за допомогою серверного редіректу

Щоб запобігти повторну відправку даних форми можна робити серверний редирект. Це робиться шляхом посилки браузеру заголовка Location з потрібним урл. Наприклад, це повинна бути сторінка з подякою за заповнену форму. Тоді ми напишемо щось в дусі:

У цьому випадку сервер отримає дані, обробить їх і замість показу результату відправить клієнта на сторінку, де цей результат буде показаний.

Недолік цього методу полягає в тому, що користувач може натиснути кнопку "Назад" і повернутися на сторінку з перенаправленням. Вона знову кине його вперед і так користувач насилу зможе повернутися на дві сторінки назад, до форми, яку спочатку заоплнял.

Запобігання повторного відправлення форми за допомогою клієнтського редиректу

У META-тегів, з іншого боку, є перевага в плані універсальності. Вони редіректят всіх і завжди.

Оптимально буде поєднувати ці два способи. Як - описав Олександр Шуркаев в замітці оптимальний редирект.

Використовуємо його метод наступним чином.

Пробуємо! Тепер, як видно, ніякого вікна не з'являється. Що ми зробили? Ми перевірили. Якщо дані прийшли - ми виводимо все необхідне для перенаправлення. В принципі, після цього вже можна навіть робити exit, щоб не вантажити браузер зайвими даними, які все одно ніхто не побачить.

Схожі статті