Несколько форм с капчей - Ошибка при отправке Ajax
-
18-09-2019 - |
Вопрос
Проблема: У меня есть страница комментариев, в каждом поле для комментариев есть кнопка "ответить".Теперь кнопки ответа имеют привязку 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 (который все еще открыт), капча завершится с ошибкой.Так что, я думаю, я мог бы попробовать (на интерфейсе):
- Разрешена только одна форма ответа одновременно
- Кэшируйте ссылку captcha и используйте ее снова для восстановления изображения, когда пользователь фокусируется на соответствующей форме
- Используйте обходной путь, упомянутый выше
Есть ли серверный способ решить эту проблему?