защита от спама с помощью jQuery и Ajax?

Я хочу сделать проверку (защита от кликов и спама), если пользователь нажимает слишком много ссылок за несколько секунд. Допустим, я хочу ограничить одну кнопку href того же типа, чтобы активировать счетчик, который не позволяет мне снова нажать на эту кнопку href через 10 секунд.

У меня есть список событий, к которым вы можете присоединиться как пользователь, например кнопка присоединения к событию в Facebook. Но поскольку этот список событий очень компактен, в нем много кнопок для присоединения. Вот почему я хочу, чтобы пользователь не спамил базу данных, нажимая эти кнопки присоединения.

Я использую jQuery, и это мой код:

$(function() {
  $(".event_join").click(function() {

    var id = $(this).attr("id");
    var uid = <?php echo $_SESSION['uid']; ?>;
    var dataString = 'event_join=' + id + '&uid=' + uid;

    if (uid == '') {
      alert("not logged in");
    } else {
      $("#event_" + id).html('Joining the guestlist...');

      $.ajax({
        type: "POST",
        url: "ajax_insert.php",
        data: dataString,
        cache: false,
        success: function(html){
          $("#event_" + id).html('You're on the guestlist!');
        }
      });
    } return false;
  });
});

Это обычный способ проверки в файле ajax_insert.php? Если да, как я могу сказать jQuery, что это не «успех», и распечатать ошибку?


person Vay    schedule 07.05.2013    source источник


Ответы (2)


Используйте «флаг». Объявить var flag = 0; изначально. Затем в коде используйте его следующим образом:

if(flag==0) {
flag = 1;
$.ajax({
    type: "POST",
    url: "ajax_insert.php",
    data: dataString,
    cache: false,
    success: function(html){
        $("#event_" + id).html('You're on the guestlist!');
        flag=0;
    }
});

Таким образом, дубликаты могут быть предотвращены. И после отправки вы можете отключить форму с помощью javascript, чтобы пользователь не мог отправить другой запрос.

РЕДАКТИРОВАТЬ 1: Если вы используете ссылку, вы можете отключить саму ссылку. Есть много способов сделать это. Нравиться

$('.event_join').removeAttr('href');

Второй способ — изменить адрес ссылки.

$('.event_join').attr('href','#');

or

$('.event_join').attr('href','javascript:void(0)');

Третий способ может заключаться в том, что вы делаете ссылку скрытой.

$('.event_join').css({'display':'none'});

Четвертый способ — полностью удалить ссылку.

$('.event_join').html('');

или лучше, если у его родителя есть только один ребенок,

$('.event_join').parent().html('');

Способов может быть много, просто поищите в сети.

Если у вас много ссылок с классом event_join, используйте $('this') вместо $('.event_join'), чтобы не все ссылки отключались/скрывались/удалялись. Полный код может быть:

if(flag==0) {
flag = 1;
$.ajax({
    type: "POST",
    url: "ajax_insert.php",
    data: dataString,
    context: $(this),
    cache: false,
    success: function(html){
        $("#event_" + id).html('You're on the guestlist!');
        $(this).removeAttr('href');
        flag=0;
    }
});

Атрибут href удаляется после успеха, так как может быть вероятность того, что запрос ajax не будет выполнен в самом первом клике. А флаг используется для предотвращения нескольких кликов до запуска функции успеха.

person kushpf    schedule 07.05.2013
comment
Но я не использую форму, я использую обычную текстовую ссылку ‹ a href. Есть ли решение и для этого? - person Vay; 08.05.2013
comment
Конечно. Отключить ссылку после нажатия. Можно сделать разными способами: удалить атрибут href с помощью javascript/jquery или скрыть саму ссылку. - person kushpf; 08.05.2013
comment
Хорошо, вот что делает Ctrl+R. Тогда вы можете использовать регистрацию пользователя и вход в систему в таком случае или какие-то лучшие идеи @zeliboba? stackoverflow.com/questions/2505289/ - person kushpf; 08.05.2013
comment
Подождите секунду, Ctrl + R повторно отправит данные, если форма использует только POST. Здесь данные передаются с помощью AJAX, так что проблем не будет. Используйте решение @Vay. - person kushpf; 08.05.2013
comment
@k_programmer CTRL+R сбросит вашу идею, чтобы очистить атрибут href или аналогичные идеи. Лучший способ указан в моем ответе ниже. Автор может решить свою задачу только с помощью сервера, т.к. многие клики можно сделать и без браузера вообще. - person zelibobla; 08.05.2013
comment
@zeliboba Ваш ответ просто проверяет, были ли данные успешно отправлены на сервер или нет. Вопрос заключается в том, как обрабатывать несколько кликов. Ctrl + R в основном перезагружает страницу, так что это будет проблемой в любом случае, если только файлы cookie не используются и не делают все. - person kushpf; 09.05.2013

Вы можете сделать так, как вы указали. Непонятный код javascript, но он работает. Есть два способа проверить ответ успешно или нет.

Первый — анализ ответа сервера. В этом случае для успеха сервер должен вернуть что-то вроде этого:

  echo( json_encode( array( 'result' => true ) ) );
  exit();

И для ошибки:

  echo( json_encode( array( 'result' => false ) ) );
  exit();

А на стороне клиента json-ответ сервера будет автоматически анализироваться JQuery. Итак, обработайте ответ следующим образом:

success: function( response ){
  if( 'undefined' == typeof response.result ||
      false == response.result ){
    console.log( 'Server returned error. Handle it here' );
  } else {
    console.log( 'Server returned success!' );
  }
}

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

http_response_code( 200 );
echo( 'Good, lets go' );
exit();

И для ошибки:

http_response_code( 401 );
echo( 'It looks like you are bad boy' );
exit();

В этом случае на стороне клиента вы можете поймать ответ сервера следующим образом:

success: function( response ){
  console.log( 'Server returned http200 code. It means request was success and we do not need even to parse result' );
},
error: function( jqXHR, textStatus, errorThrown ){
  console.log( 'Server returned error. This could be not only an error you awaiting for, but any other. All error details are provided in incoming variables' );
}
person zelibobla    schedule 07.05.2013