Как правильно хранить конфиденциальные данные приложения на Java? - PullRequest
15 голосов
/ 11 октября 2008

где вы храните пользовательские и машинные среда выполнения данные конфигурации для приложения J2SE?

(Например, C: \ Users \ USERNAME \ AppData \ Roaming \ в Windows и / home / username в Unix)

Как получить эти местоположения в файловой системе независимо от платформы?

Спасибо за ваш совет!

Ответы [ 6 ]

26 голосов
/ 11 октября 2008

Первый в формате:

  1. Java файлы свойств подходят для пар ключ / значение (также автоматически обрабатывают символы новой строки). Степень структуры возможна при использовании «точечной нотации». Недостатком является то, что структура не позволяет легко перечислять объекты конфигурации верхнего уровня и работать в режиме детализации. Лучше всего использовать для небольшого набора часто настраиваемых параметров среды
  2. XML-файлы - довольно часто используются для более сложной конфигурации различных сред Java (особенно J2EE и Spring). Я бы посоветовал вам хотя бы узнать о Spring - в нем много идей, которые стоит знать, даже если вы решите не использовать его. Если вы решите свернуть свою собственную конфигурацию XML, я бы порекомендовал использовать XStream с настроенными параметрами сериализации или, если вам просто нужно проанализировать какой-либо XML, взгляните на XOM . BTW Spring также позволяет вам подключать ваш пользовательский язык конфигурации XML, но это относительно сложная задача . Конфигурация XML лучше всего использовать для более сложной «внутренней» конфигурации, которую конечный пользователь не видит и не настраивает.
  3. Сериализованные объекты Java - быстрый и простой способ сохранить состояние объекта и восстановить его позже. Полезно, если вы пишете графический интерфейс конфигурации, и вам все равно, будет ли конфигурация понятной человеку. Остерегайтесь проблем совместимости при разработке классов.
  4. Предпочтения - представленные в Java 1.4 , позволяют хранить печатный текст, числа, байтовые массивы и другие примитивы в хранилище, специфичном для платформы. В Windows это реестр (вы можете выбрать между / Software / JavaSoft / Prefs в HKLM или HKCU ). В Unix тот же API создает файлы под пользователем home или / etc . Каждый куст настроек можно экспортировать и импортировать в виде файла XML. Вы можете указать пользовательскую реализацию интерфейса PreferencesFactory , установив для свойства JVM "java.util.prefs.PreferencesFactory" имя класса реализации.

В целом использование API prefs может быть хорошим или плохим в зависимости от сценария вашего приложения.

  1. Если вы планируете запускать несколько версий одного и того же кода на одном и том же компьютере с разной конфигурацией, тогда использование API настроек является плохой идеей.
  2. Если вы планируете использовать приложение в ограниченной среде (домен Windows или жестко управляемый Unix-блок), вам необходимо убедиться, что у вас есть надлежащий доступ к необходимым ключам / каталогам реестра. Это застало меня врасплох не раз.
  3. Остерегайтесь перемещаемых профилей (реплицированных домашних папок), они компенсируют некоторые забавные сценарии, когда задействовано более одной активной машины.
  4. Настройки не так очевидны, как файл конфигурации в каталоге приложения. большинство сотрудников службы поддержки настольных компьютеров не ожидают и не любят их.

Относительно расположения файлов настроек, это опять же зависит от вашего приложения. Общее предложение:

  1. Упакуйте большинство ваших XML-файлов в JAR-файл приложения либо в корневой каталог, либо в каталог / META-INF. Эти файлы будут доступны только для чтения и считаются закрытыми для приложения.
  2. Поместите изменяемую пользователем конфигурацию в $ APP_HOME / conf . Он должен состоять в основном из файлов свойств и иногда из простого XML-файла (сериализация XStream). Эти файлы настраиваются как часть процесса установки и, как правило, не обслуживаются пользователем.
  3. В разделе user-home в точечной директории (т. Е. «~ / .Myapplication») хранится любая пользовательская конфигурация. Пользовательская конфигурация может переопределить конфигурацию в каталоге приложения conf . Любые изменения, сделанные внутри приложения, идут сюда (см. Также следующий пункт).
  4. Вы также можете использовать каталог $ APP_HOME / var для хранения любых других изменяемых данных, относящихся к этому экземпляру приложения (в отличие от пользователя). Еще одним преимуществом этого подхода является то, что вы можете перемещать и создавать резервные копии всего приложения и его конфигурации, просто копируя один каталог.

Это иллюстрирует некоторые стандартные методы управления конфигурацией. Вы можете реализовать их, используя различные библиотеки и инструменты, начиная с необработанного JRE, добавляя Spring / Guice или переходя на полный контейнер J2EE (возможно, со встроенным Spring)

Другие подходы к управлению конфигурацией:

  1. Использование нескольких базовых каталогов для запуска нескольких экземпляров приложения с использованием разных конфигураций.
  2. Использование облегченных реестров для централизованного управления конфигурацией
  3. Файл базы данных управления конфигурацией с централизованным управлением (CMDB), содержащий специфичные для хоста значения для каждого компьютера, каждую ночь rsync-ed для всех рабочих хостов. Приложение использует шаблонную конфигурацию и выбирает из CMDB во время выполнения на основе текущего имени хоста.
13 голосов
/ 11 октября 2008

Это зависит от вашего типа приложения J2SE:

  • Исполняемый JAR-файл J2SE (очень простой): используйте user.home Системное свойство , чтобы найти home-dir. Затем создайте соответствующий подкаталог (например, PGP, SVN, ... do)
  • Java Web Start предоставляет очень хорошие включенные методы для безопасных свойств. Всегда зависит от пользователя
  • Наконец, Eclipse RCP: у вас есть понятие рабочего пространства (также полученное из user.home) для пользователей и конфигурации (не совсем уверенного, как получить доступ к этому хитрому в Vista) для использования на компьютере

Все эти подходы при осторожном использовании - используйте правильный separatorChar - ОС нейтральна.

5 голосов
/ 11 октября 2008

Java имеет библиотеку, специально предназначенную для этого в java.util.prefs.Preferences .

Preferences userPrefs = Preferences.getUserNodeForPackage(MyClass.class); // Gets user preferences node for MyClass
Preferences systemPrefs = Preferences.getSysteNodeForPackage(MyClass.class); // Gets system preferences node for MyClass
Preferences userPrefsRoot = Preferences.getUserRoot(); // Gets user preferences root node
Preferences systemPrefsRoot = Preferences.getSystemRoot(); // Gets system preferences root node
1 голос
/ 11 октября 2008

Возможно, вы захотите взглянуть на Resource Bundles .

0 голосов
/ 25 июля 2015

Я использую это


    String pathFile = null;
    if(OS.contains("win")){
        pathFile = System.getenv("AppData");
    }else{
        pathFile = System.getProperty("user.home");
    }

Здесь я сохраняю настройки своего приложения C: \ Users \ USERNAME \ AppData \ в Windows user.home (/ home / USERNAME) на других платформах

0 голосов
/ 11 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...