Не используйте GET-запросы для внесения изменений! Be RESTful ; используйте POST (или PUT), вместо этого браузер должен предупредить пользователя не перезагружать запрос. Перенаправление ( с использованием перенаправления HTTP ) на страницу квитанции с использованием обычного запроса GET после запроса POST / PUT позволит обновить страницу без предупреждения о повторной отправке.
EDIT:
Я предполагаю, что пользователь вошел в систему каким-либо образом, и поэтому у вас уже есть какой-то способ отслеживания пользователя, например, сеанс или аналогичный.
Вы можете сделать временную метку (или случайный хеш и т. Д.) При отображении формы, хранящей ее как скрытое поле ( только помимо токена анти-межсайтового запроса, я уверен, что у вас уже есть там ) и в переменной сеанса (которая безопасно хранится на вашем сервере), когда вы получаете запрос POST / PUT для этой формы, вы проверяете, что метка времени совпадает с меткой в сеансе. Если это так, вы устанавливаете временную метку в сеансе на переменную, которую сложно угадать (например, временную метку, соединенную с какой-то секретной строкой), затем вы можете сохранить данные формы. Если кто-то повторяет запрос сейчас, вы не найдете то же значение в переменной сеанса и отклоните запрос.
Проблема с этим заключается в том, что форма недействительна, если пользователь щелкает обратно, чтобы что-то изменить, и это может быть немного грубым, если только вы не обновляете деньги. Поэтому, если у вас есть проблемы с «глупыми» пользователями, которые обновляют и нажимают кнопку «Назад», таким образом, случайно перепостывая что-то, простое использование POST напомнит им не делать этого, а перенаправление сделает это менее вероятным. Если у вас есть проблема со злонамеренными пользователями, вы должны также использовать временную отметку, хотя это иногда будет сбивать с толку пользователей, хотя, если пользователи намеренно публикуют одно и то же сообщение снова и снова, вам, вероятно, необходимо найти способ их запретить. Использование POST, наличия временной отметки и даже полного сравнения всей базы данных для проверки на наличие дублирующих сообщений вообще не поможет, если злонамеренные пользователи просто напишут скрипт для автоматической загрузки формы и отправки случайного мусора. (Но защита от межсайтовых запросов делает это намного сложнее)