Режим транзакции для операций файла в Java

ОБНОВЛЕНИЕ : ниже было верно, и должен быть верным, если все браузеры и плагины были правильно реализованы. К сожалению, мы теперь знаем, что они не, и что определенные комбинации плагинов браузера и перенаправлений могут позволить взломщику предоставлять произвольные заголовки по междоменному запросу. К сожалению, это означает, что даже Ajax запрашивает с "X-Requested-With: XMLHttpRequest" заголовок должен теперь быть CSRF-защищен. В результате Django больше не освобождает запросы Ajax от защиты CSRF .

Исходный Ответ

стоит упомянуть, что защита запросов Ajax от CSRF является ненужной, так как браузеры не позволяют запросы Ajax перекрестного сайта. На самом деле промежуточное программное обеспечение Django CSRF теперь автоматически освобождает запросы Ajax от маркера CSRF, сканируя .

Это только допустимо при фактической проверке серверной стороны заголовка X-Requested-With на значение "XMLHttpRequest" (который Django делает), и только освобождение реальных запросов Ajax от сканирования CSRF.

42
задан Giroscopio 21 August 2009 в 09:58
поделиться

5 ответов

Взгляните на транзакцию Apache Commons . Он имеет возможность управлять файлами транзакционно.

В заархивированной статье подробно описано его использование с файловой системой.

update

Имейте в виду, что статус на главной странице говорит:

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

30
ответ дан 26 November 2019 в 23:55
поделиться

Не существует стандартного API файлов транзакций, однако я полагаю, что существует проект Apache, который реализует то, что вы хотите.

http://commons.apache.org/transaction/ file / index.html

Пакет транзакционных файлов предоставляет вам код, который позволяет выполнять атомарные операции чтения и записи в любой файловой системе. Диспетчер файловых ресурсов предлагает вам возможность изолировать ряд операций с набором файлов в транзакции. Используя пакет locks, он может предложить вам полные ACID-транзакции, включая сериализуемость. Конечно, чтобы эта работа работала, весь доступ к управляемым файлам должен осуществляться этим менеджером. Прямой доступ к файловой системе не может отслеживаться менеджером.

update

Имейте в виду, что статус на главной странице говорит:

Мы решили перевести проект в неактивный режим, так как мы убеждены, что основная заявленная функция - транзакционный доступ к файлам - не может быть надежно реализована. Мы убеждены, что такая реализация невозможна поверх обычной файловой системы. Хотя есть и другие полезные части (например, многоуровневая блокировка, включая обнаружение взаимоблокировок), транзакционная файловая система является основной причиной, по которой люди используют эту библиотеку. Поскольку его просто невозможно сделать полностью транзакционным, он не работает так, как рекламируется.

8
ответ дан 26 November 2019 в 23:55
поделиться

Нет, по крайней мере, простым звонком. Файловые системы в целом (и операции файловой системы Java в частности) не поддерживают "откат".

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

Затем обработайте его, а затем измените файл. Если что-то пойдет не так, просто откатите БД, переименуйте все файлы с суффиксами обратно в их исходные имена, и все будет готово.

В качестве бонуса на некоторых FS переименование даже атомарно, так что вы должны будьте осторожны даже с одновременными обновлениями (не знаю, актуально ли это для вас). Однако я не знаю, является ли переименование файлов атомарным в Java; вам нужно будет проверить.

4
ответ дан 26 November 2019 в 23:55
поделиться

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

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

4
ответ дан 26 November 2019 в 23:55
поделиться

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

Если ваше приложение не находится в среде, поддерживающей JCA, вы также можете использовать автономный диспетчер транзакций, такой как Atomikos, и выполнять транзакции XA с участием как файлов (с использованием XADisk), так и базы данных.

update

Домашняя страница проекта больше не существует, и последний выпуск Maven был в 2013 году.

7
ответ дан 26 November 2019 в 23:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: