[web] перезагрузка страницы при нажатии кнопки "назад"
Или, как вариант, чтобы вообще нельзя было туда вернуться.или посылать ajax-ом, или модифицировать историю браузера
в интернете я нашёл только, как перехватывать покидание страницы, в том числе через кнопку "назад" - но этот вариант не подходит, потому что на моей страничке расположена формочка, которая посылает клиента на другой сайт, не под моим контролем - так вот нужно, чтобы на тот сайт не отправлялись несколько раз одни и те же данные
а нельзя просто сделать, чтоб какой-нибудь javascript вызвался, когда на страницу заходят повторно?такое есть в виде хаков, на надежное решение я бы не рассчитывал
так вот нужно, чтобы на тот сайт не отправлялись несколько раз одни и те же данныеты можешь назначить своей странице уникальный маркер и перед перекидыванием на чужой сайт проверить на своем сервере, что такой маркер еще не использовался.
на моей страничке расположена формочка, которая посылает клиента на другой сайтперед отправкой формы аяксом запроси сперва свой сайт (там, конечно, придется вести какой-то учет данных с формы если данные уже были, дальше сабмит можно не выполнять.
можно ли как-то сделать, чтоб при этом данные в формочке менялись (взяв с сервера новые данные и только потом отправлялся POST-запрос?
по идее ajax для этого, но я слышал, что это сложно, а мне нужно относительно простое решение, потому что сложный способ решить эту проблему я уже знаю
то есть я могу например взять чужой пример, и вставить туда свои поля, или могу сам придумать буквально несколько строк, если известно, в каком мануале написано всё нужное, а что-то более сложное уже не требуется
можно ли как-то сделать, чтоб при этом данные в формочке менялись (взяв с сервера новые данные и только потом отправлялся POST-запрос?можно. Да, через ajax. Если брать jquery, то будет не сложно, если есть хоть какое-то знакомство с js
а можно просто в функции onclick задизаблить кнопку, а потом сделать form.submit ?
конечно можно. неужели клиентской валидации на сайтах не видел?
не уверен, что произойдет, если воткнуть в html-заголовок страницу meta refresh или meta http-equiv redirect — надо проверять
нужно, чтобы на тот сайт не отправлялись несколько раз одни и те же данныевообще не доверяй такую логику клиентской части
http://en.wikipedia.org/wiki/Post/Redirect/Getв данном случае это не поможет. на начальную страницу всё равно же можно вернуться и заново нажать отправить
ps
PRG помогает только убрать ситуацию, когда браузер спрашивает у пользователя - а вы уверены, что заново хотите отправить данные?
в данном случае это не поможет. на начальную страницу всё равно же можно вернуться и заново нажать отправить
Да, я невнимательно прочитал вопрос.
на начальную страницу всё равно же можно вернуться и заново нажать отправитьМеня терзают смутные сомнения, что например в опере был шорткат типа "отправить форму в новой вкладке". Соответвенно вкладка с заполненной формой никуда не девается,и можно её переотправлять сколько душе угодно.
вообще не доверяй такую логику клиентской частив моём случае посылать одинаковые запросы не в интересах пользователя, просто он об этом не знает, а инструкцию прочитает уже после того, как случится неприятность
так что самая простая "защита" его спасёт
конечно можно. неужели клиентской валидации на сайтах не видел?а вот и нельзя
после возврата на страницу изменения откатываются, кнопка снова активна
пусть изначально кнопка задизаблена. аякс запрос отсылает данные к тебе на сервер где проверяется не оотправлялись ли ещее такиие данные? еслии нет то аякс запрос энейблид кнопку у которой по онклику стоит опять же ее задизабливание и уже затем идет форм сабмит. все это строк 10-20 кода
Убери вообще сабмит из формы. Вкорячь обычную кнопку/div/etc, повесь на неё onclick и в процедуре онклика делай document.formName.submit предварительно проверив условие.
сильно больше 20 строк получается
ps
тебя скорее всего обосрут, но решение станет короче
window.onbeforeunload = function {
location.replace('http://www.google.com');
}
в моём случае посылать одинаковые запросы не в интересах пользователя, просто он об этом не знает, а инструкцию прочитает уже после того, как случится неприятностья бы не называл хак защитой
так что самая простая "защита" его спасёт
имхо, любое нестандартное поведение - это хак
я бы делал так:
- в каждой странице есть уникальный ключ hid полем
- отправленная форма содержит этот ключ
- сервак запонимает что ключ был использован
- при нажатии назад и перепосылке формы - сервак вернет ошибку со словами что такие данные уже были введены
onbeforeunload далеко не во всех работает, но вообще правильно
Если нужна защита от повторного сабмита, то общепринятой практикой является post-redirect-get. Или что-то другое нужно?
общепринятой практикой является post-redirect-getможно пояснить?
можно пояснить?http://en.wikipedia.org/wiki/Post/Redirect/Get
Функция вешается на кнопку Submit.
Ничего браузеро-специфичного нет здесь?
function submitclick(geturl, ordernumber, clid) {
document.getElementById("ReturnButtonDiv").style.display = "block";
document.getElementById("ProgressText").innerHTML="Обработка запроса...";
document.getElementById("SubmitButton").disabled = "true";
document.getElementById("SubmitButtonDiv").style.display = "none";
$.ajax({
'url' : geturl,
'type' : 'GET',
'data' : {
'account' : clid,
'ordernumber' : ordernumber
},
'success' : function(data) {
document.getElementById("ProgressText").innerHTML="";
if (data == "ok") {
document.getElementById("Form1").submit ;
} else {
alert("Продолжение невозможно. Используйте кнопку 'Вернуться'" +
" для повторной попытки.");
}
}
});
}
PRG implements bookmarks and the refresh button in a predictable way that does not create duplicate form submissions.С букмарками и кнопкой "refresh" проблем не было, проблема с кнопкой "назад".
С букмарками и кнопкой "refresh" проблем не было, проблема с кнопкой "назад".Я на 100% не уверен, но вроде с кнопкой назад тоже нет проблем.
document.getElementById("SubmitButtonDiv").style.display = "none";
Можно заменить на
$("#SubmitButtonDiv").hide;
Я на 100% не уверен, но вроде с кнопкой назад тоже нет проблем.ну нужно было, чтобы пользователь не мог вернуться, нажать кнопку ещё раз и послать в результате повтороный запрос
я не вижу, какие редиректы могут ему помешать
ну нужно было, чтобы пользователь не мог вернуться,Вернуться кнопкой back?
ну то есть специально хакать никто не будет, потому что это не в их интересах - но никакие интуитивно верные действия не должны приводить к повторной посылке формы
Как-то так получается, уже больше 20 строк, и это без серверной части.Функция вешается на кнопку Submit.Ничего браузеро-специфичного нет здесь?больше но не сильно
в принципе о таком решении и шла речь. у тебя тут всего то 9 операторов.
а серверную часть напиши на основе кукисов или даже может быть сессии
это поведение зависит от браузера.забавно, как мозилла мой скрипт обрабатывает
если вернуться, что кнопка submit видна, но задизаблена - только часть изменений сохраняется, жесть
Можно ли надёжно сделать, чтобы при нажатии кнопки "назад" в браузере содержимое странички загружалось не из кеша, а заново с сервера? Или, как вариант, чтобы вообще нельзя было туда вернуться.че, плохо без шаллера )
Страничка получается как результат POST-запроса.
Заголовок "Cache-control: no-cache, must-revalidate" не помогает.
это не для форума
В общем, мне казалось, что нажимая кнопку back нельзя вернуться на форму до редиректа. Проверил, оказалось что можно.
в идеале никаким способом нельзя должно бытья тебе уже писал: занимаешься ерундой
ну то есть специально хакать никто не будет, потому что это не в их интересах - но никакие интуитивно верные действия не должны приводить к повторной посылке формы
запоминать что реквест уже был и отвергать на сервере его повторный субмит - это гораздо проще прогать, не зависит от браузера, не ломает стереотипов пользователей
сервер этого делать не хочет
сервер этого делать не хочетМожно и на клиенте запомнить - в какой-нить куке или типа того.
Или в своем вспомогательном сервере
Оставить комментарий
Marinavo_0507
Можно ли надёжно сделать, чтобы при нажатии кнопки "назад" в браузере содержимое странички загружалось не из кеша, а заново с сервера? Или, как вариант, чтобы вообще нельзя было туда вернуться.Страничка получается как результат POST-запроса.
Заголовок "Cache-control: no-cache, must-revalidate" не помогает.