Несколько форм с капчей - Ошибка при отправке Ajax

StackOverflow https://stackoverflow.com/questions/2001561

Вопрос

Проблема: У меня есть страница комментариев, в каждом поле для комментариев есть кнопка "ответить".Теперь кнопки ответа имеют привязку jquery live click к ним, которая при срабатывании загружает соответствующую форму комментария через ajax.Помимо обычных полей, каждая форма также содержит ввод капчи.После успешной отправки формы (или иным образом) я обновляю капчу следующим образом:

// submit triggered and form serialized
$.ajax({
 type: 'POST',
 url: myaction,
 data: serializedForm,
 cache: false,
 success: function(data, status) {
    //checks errors from server
    $servererr = $(data).find('.error_list');
    if($servererr.length === 0)
    {
      //flash success message...
      //refresh captcha
      $thisform.find('.captcha_img_refresh').trigger('click.refresh');
    }
    else {
       //flash the server errors and then refresh captcha         
      $thisform.find('.captcha_img_refresh').trigger('click.refresh');
    }
});

Теперь у меня есть 2 новые формы комментариев (f1 и f2), открытые на одной странице (имеющие 2 разных действия, скажем, / post / f1 и post / f2 соответственно).Я отправляю f1, и никаких сообщений об ошибках не поступало.Затем я перехожу ко второй форме и ввожу все допустимые данные, и она выдает ошибку captcha с сервера (поэтому выполняется приведенная выше инструкция else ajax).Шоу с поджигателями:

> //for first form
> POST http://mysite.com/post/f1 302 Found 111ms
> GET http://mysite.com/post/f1 200 OK 600ms
> 
> //for 2nd form
> POST http://mysite.com/post/f2 200 OK 800ms

Почему это происходит?Все остальное кажется нормальным (также нет проблем с отправкой форм с отключенным javascript).

Форма HTML:

<form id="comment-form-<unique-number>" class="comment-form-new" action="/post/<separate-action>" method="post" style="">
 <p>Leave a comment:</p>
   <ul>
    <li>
     <textarea rows="10" cols="71" name="myform[text]" id="myform_text"></textarea></li>
    <li>
     <label for="myform_username">Name (required)</label>
     <input type="text" name="myform[username]" value="Anonymous" id="myform_username" /></li>
   <li>
      <label for="myform_email">Email (required)</label>
      <input type="text" name="myform[email]" value="" id="myform_email" />
   </li>

   <li>
    <label for="myform_captcha">Please enter code shown below:</label>
     <input type="text" name="myform[captcha]" id="myform_captcha" />
   </li>
   <li>
     <img id="captcha_img" src="/mysite/captcha/126263" alt="Captcha Image">
     <!-- this refreshes captcha -->
     <a class="captcha_img_refresh" id="captcha_img_refresh"><img src="/images/reload_original.png" /></a>
   </li>
   <input type="hidden" name="myform[comment_id]" value="10" id="myform_comment_id" />
   <li>
     <input type="submit" value="Submit" id="comment-form-submit" />
   </li>
</ul>

Другие детали: После загрузки каждой формы комментария я выполняю обычную привязку отправки (не привязку в реальном времени) к ней.Значения для каждой формы сериализуются и отправляются в том виде, в каком они были введены в полях, которые можно подтвердить с помощью журналов консоли.Я использую библиотеку Cryptographp (http://www.captcha.fr/) для captcha.

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

Это было полезно?

Решение

Хорошо ... я провел еще несколько тестов, и вот что, по моему мнению, происходит (я тоже могу ошибаться):ссылка на изображение captcha, которая представляет собой что-то вроде: /mysite/капча/(случайное число), вероятно, генерируется один раз на сервере для каждой формы.Когда я загружаю f1, а затем f2, ссылка на captcha для f2 сохраняется в серверной части, которая в основном обнуляет ссылку на captcha f1.Следовательно, если я отправлю f1 (который все еще открыт), капча завершится с ошибкой.Так что, я думаю, я мог бы попробовать (на интерфейсе):

  1. Разрешена только одна форма ответа одновременно
  2. Кэшируйте ссылку captcha и используйте ее снова для восстановления изображения, когда пользователь фокусируется на соответствующей форме
  3. Используйте обходной путь, упомянутый выше

Есть ли серверный способ решить эту проблему?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top