Как я могу передать произвольные системные свойства, значения которых могут измениться, в подписанный Java RIA (апплет, веб-запуск) через JNLP?

В связи с более строгими ограничениями безопасности в 7u51, которые вступят в силу в январе, я m пытаюсь подписать мой файл JNLP.

Наше приложение требует установки определенных пользовательских системных свойств, и значения некоторых из этих свойств различаются в зависимости от того, где развертывается апплет. Я хотел бы избежать повторной подписи JAR, содержащего шаблон JNLP, для каждого развертывания.

Наивный подход с размещением <property name="my-prop" value="*"/> в шаблоне JNLP не работает.

Даже с <property name="my-prop" value="fixed-value"/> в шаблоне я иногда получаю сообщение "Это приложение собирается выполнить небезопасную операцию. Продолжить?":

диалог безопасности небезопасной операции

Как правильно передать системные свойства подписанному Java RIA?


person Matt McHenry    schedule 06.12.2013    source источник


Ответы (1)


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

Подстановочные знаки не допускаются в значениях свойств

В спецификации JNLP говорится:

Ожидается, что клиент JNLP внесет в черный список (или ограничит) определенные элементы jnlp и значения аргументов, такие как java-vm-args или имя и значение свойства, для обеспечения безопасности. Точный список зависит от индивидуальных реализаций клиента JNLP.

Фактически, реализация Oracle (по крайней мере, в 7u45) заносит в черный список атрибут value элемента <property/> — его нельзя использовать подстановочные знаки. Мне не удалось найти причину этого решения, но она есть.

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

Обходной путь: веб-запуск

В файле JNLP включите несколько аргументов с подстановочными знаками:

<application-desc main-class="com.example.YourMainClass">
  <argument>*</argument>
  <argument>*</argument>
</application-desc>

В методе main вашего приложения проанализируйте эти аргументы и скопируйте их в системные свойства, используя System.setProperty(), пропуская аргументы, которые все еще имеют буквальное значение "*". Я рекомендую просто разделить каждый аргумент при первом появлении "=". (Если ваше приложение уже принимает обычные аргументы, вам придется проявить немного изобретательности.)

Обходной путь: апплет

В файле JNLP включите параметры, определяющие свойства системы, которые необходимо установить:

<applet-desc main-class="com.example.YourMainClassApplet">
  <param name="SYS_PROPERTY_PARAMETERS" value="prop1,prop2"/>
  <param name="prop1" value="*"/>
  <param name="prop2" value="*"/>
</applet-desc>

В вашем Applet.init() метод, получите значение параметра SYS_PROPERTY_PARAMETERS и повторите его, чтобы получить значение каждого параметра. Если это не литерал "*", скопируйте его в системное свойство, используя System.setProperty().

Диалоговое окно «Небезопасная операция»

Это ошибка в подключаемом модуле Oracle, вызванная использованием LiveConnect ( Взаимодействие Java ‹-› JavaScript).

Обходной путь: безопасные префиксы свойств

Префикс всех системных свойств, установленных через элементы <property/> в JNLP, с префиксом "jnlp.":

<property name="jnlp.my-prop" value="fixed-value"/>

Затем в методе main() или Applet.init() вашего приложения переберите копию System.getProperties() и, если имя свойства начинается с "jnlp.", скопируйте его значение в свойство с таким же именем, убрав этот префикс. (Итерация по копии необходима, чтобы избежать ConcurrentModificationException.)

Подсказка: валидатор шаблонов JNLP учитывает порядок атрибутов XML

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

<jnlp codebase="*" spec="1.0+">
<j2se java-vm-args="-Xms256M -Xmx512M -XX:MaxPermSize=256m" version="1.6+"/>
person Matt McHenry    schedule 06.12.2013