Когда API формы генерирует форму, он также генерирует токен, который передается с формой в скрытом поле и ожидается, что он будет возвращен обратно. Если это так, форма обрабатывается.
Если визуализированная форма где-нибудь будет кэширована, скажем, Varnish , этот механизм сломается. Первый пользователь, отправляющий форму, будет использовать токен, и последующие попытки использовать форму будут отклонены.
Какие стратегии доступны для поддержания работы форм при кэшировании их визуализированной формы?
Ответы:
Я использую BOA для своих сайтов, но по умолчанию BOA просто отключает кэширование на лету для отправки форм. Помимо моего реального опыта, я столкнулся с однолетним искусством по поводу того, как Почта Новой Зеландии работает с Drupal & Varnish и проблемой с токенами форм. Святой Джон Уэйн, его обязательно нужно прочитать для кеширования Drupal - действительно. Ориентируясь только на вопрос формы:
Вы также можете отключить токены форм, когда в X_FF не требуется получение XSRF (unset ($ form ['# token']);) или ($ form ['# token'] = FALSE;)
An Acquia Drupal производительности статья выдвигает Drupal модуль Authcache , но , читая документ на Authcache, она работает кэширование с держателем места для формы (не кэширует форму):
Стратегия такова: кешировать все, кроме формы . Итак, обращаясь ко всему остальному: может, Varnish вообще не используется, Memcache & Redis? Моя стратегия состояла бы в том, чтобы использовать то, что предлагает BOA, потому что я использую BOA, и мастера за ним ( omega8.cc ) знают на тонну больше, чем я. Я не думаю, что существует внешний кеш, который решает проблему. Кажется, все они обходят форму.
Выполните частичное кэширование с вышеупомянутым authcache и с тонко настроенными представлениями и панелями, как упомянуто в статье NZ Post и описано мозговым трастом в Wunderkraut - это старое, но решает проблему.
Используйте Drupal ESI Module и Varnish частично совместим с ESI):
Надеюсь, что это более полезно.
источник
Одним из возможных решений было бы отключить токен вместе с
$form[‘#token’] = FALSE;
последующим переопределением обратного вызова submit, вместо того, чтобы фактически публиковать комментарий, восстановить исходную форму с токеном и попросить пользователя подтвердить сообщение.Если пользователь поддерживает ECMAScript , можно улучшить взаимодействие с пользователем, имея ресурс сервисов, который предоставляет генерацию новых токенов формы и вставляет соответствующую форму в
form_cache
. Затем, как только пользователь сфокусируется на форме и, следовательно, захочет отправить ее, отключите кнопку отправки, извлеките новый токен и вставьте его в уже обработанную форму, а затем снова включите кнопку отправки.источник