Как общаться между браузером и апплетом Java Web Start
Текущая ситуация
В настоящее время мы используем апплет для выполнения некоторых операций, после чего он перенаправляет текущую страницу. По сути, вы можете увидеть апплет следующим образом:
public class ExampleApplet extends Applet {
@Override
public void init() {
Button redirect = new Button("Redirect");
this.add(redirect);
final String target = this.getParameter("targetPage");
redirect.addActionListener((ActionEvent e) -> {
try {
getAppletContext().showDocument(new URL(target), "_parent");
} catch (MalformedURLException ex) {}
});
}
}
с апплетом, вызываемым самым простым способом:
<applet code="com.example.applet.ExampleApplet.class" archive="${appletUrl}" width="100" height="30">
<param name="targetPage" value="http://localhost:8080/applet/"/>
</applet><br/><br/>
где${appletUrl}
возвращает местоположение апплета JAR.
Таким образом, апплет является не чем иным, как простой кнопкой, которая вызываетgetAppletContext().showDocument(new URL(target), "_parent");
обновить текущую страницу. Это уже давно правильно работает. Теперь вот проблема.
миграция
Как многие могут знать, Chrome не поддерживаетApplet
s. Который был отложен на некоторое время, так какIE
а такжеFireFox
все еще поддерживал их. В конце 2016 года они также больше не будут их поддерживать. Поэтому мы решили перенести апплет с помощьюJWS
а такжеJNLP
.
Перенос этого простого примера кнопки перенаправления дал бы следующееhtml
фрагмент иJNLP
файл:
<a href="${jnlpUrl}">Launch JNLP</a>
${jnlpUrl}
возвращает местоположение вJNLP
файл который:
<?xml version="1.0" encoding="utf-8"?>
<jnlp spec="1.0+" codebase="http://localhost:8080/applet/assets/1.0-SNAPSHOT-DEV/app/assets/" href="jnlp/example.jnlp">
<security>
<all-permissions/>
</security>
<resources>
<j2se version="1.5+" initial-heap-size="32m" max-heap-size="128m" />
<property name="jnlp.versionEnabled" value="false"/>
<jar href="applets/ExampleApplet.jar" main="true"/>
</resources>
<applet-desc name="code" main-class="com.example.applet.ExampleApplet.class" width="30" height="30" >
<param name="targetPage" value="http://localhost:8080/applet/"/>
</applet-desc>
</jnlp>
Пока все хорошо, тот же апплет успешно развертывается какJWS
приложение. Позволяет использовать его из любого браузера, поскольку он выполняется вне его. Что также является своего рода проблемой.
Эта проблема
ЛинияgetAppletContext().showDocument(new URL(target), "_parent");
по-прежнему выполняет перенаправление, но использует браузер по умолчанию, как указано вмиграционная документация.
Для AppletContext.showDocument (URL-адрес, String target) аргумент target будет игнорироваться технологией Java Web Start.
Подобно AppletContext.showDocument, приложения Java Web Start способны отображать HTML-страницу с помощью системного веб-браузера по умолчанию с помощью API-интерфейса BasicService.showDocument.
Так что, если моим браузером по умолчанию является FireFox, но я случайно перехожу к этомуJWS-enabled applet
в IE / Chrome будет открыта новая вкладка в FireFox. Это проблема, поскольку у меня есть информация (например, логин), сохраненная в исходном браузере!
Выводы
Поскольку приложение работает за пределами браузера, у меня возникают проблемы с возможностью обратной связи с исходным браузером. Я не могу использоватьJavaScript
так как он не работает в браузере. Я не могу определить независимый от системы способ открытия вкладки в исходном браузере. Я также думал оWebSockets
так как они могли бы разрешить прямое общение, но из того, что я прочитал, это довольно высокий уровень и требует сервера, а не простого апплета.
Есть ли возможность обмена данными между исходным браузером (например, веб-сокетами и параметрами) или передачи сеанса из одного браузера в другой, когда апплет открывает новое окно?