2015-05-14 4 views
2

Недавно я работаю над проектом, который использует ajax для вызова Java-сервлета, и запрос занимает более 10 секунд, чтобы получить ответ, поэтому мне нужно убедиться, что в течение этого времени пользователь не сможет отправить форму еще раз, и мой текущий подход обнаруживает событие нажатия кнопки отправки и отключает кнопку отправки, как только функция успеха или ошибки запускается в ajax, снова включите кнопку, но это не очень хороший подход.Что лучше всего предотвращать двойную форму submit

---- Редактировать ---- Извините, я не объяснял ясно, что я имею в виду, так это то, что это может остановить незнакомого пользователя фона, но если кто-то намеревается атаковать сайт или по какой-либо причине, они может просто изменить html-код, чтобы включить кнопку, и сделать еще один,

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

Извините за мой английский :)

+5

Почему отключить кнопку отправки не подходит? –

ответ

2

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

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

var isSubmitting = false; 

function handleClick(){ 
    if (!isSubmitting) 
    { 
     isSubmitting = true; 
     $.ajax(
      "http://yourservice/submit" { 
       data: {someData:123}, 
       contentType: 'application/json', 
       type: 'POST', 
       success: function(){ 
        isSubmitting = false; 
       }, 

      }); 

    } 
} 

Об редактирования, куки звучит как хороший подход, в основном вам нужно что-то, что сервер собирается перейти к клиенту, а затем проверить на отправке. как только это будет разрешено, сервер предотвратит обработку дополнительных запросов с тем же параметром.

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

Таким образом, в конце, если вы просто хотите предотвратить случайные отправки, скрыть кнопку достаточно.

+0

Спасибо, что ответили на вопрос! Этот подход преуспевает, но все же необходимо иметь дело с объемом isSubmitting. –

+0

Можете ли вы прояснить, что вы имеете в виду, имея дело с областью? Вам просто нужно разместить эту переменную в разумном месте, но если вы сохраните структуру выше, тогда не будет проблем с определением области видимости.Я не могу сказать вам хорошее место, чтобы объявить об этом, если вы не покажете мне какой-то ваш код. – Luis

+0

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

0

Что-то я сделал, и был успешным является сочетание того, что вы описали и предотвращения функции, вызываемой кнопкой дважды выполнить. Я делаю это, сохраняя переменную, которая получает значение true с первым запросом, а затем при последующем запросе я проверяю ее, если это правда, я ничего не делаю. Что-то вроде этого:

var isRequestAlive = false; 

var submit = function(){ 
    if(!isRequestAlive){ 
     isRequestAlive = true; 
     doAjaxStuff("", function(){ 
      isRequestAlive = false; 
     }) 
    } 
} 
+0

Это, конечно, очень упрощенный пример, нужно учитывать такие вещи, как область видимости, но это должно дать вам представление. – jarz

+0

Любопытно, почему вы сделали бы и то и другое? Я имею в виду, если вы отключите кнопку, это также отключит вызов функции .... – Luis

+0

Думая о проблеме с синхронизацией, когда второй клик настолько быстр, что это происходит до того, как мы (установите переменную (isRequestAlive) в true) Я имею в виду, отключить кнопку , – jarz

Смежные вопросы