Как общаться между браузером и апплетом 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}&nbsp;возвращает местоположение апплета JAR.

Таким образом, апплет является не чем иным, как простой кнопкой, которая вызываетgetAppletContext().showDocument(new URL(target), "_parent");&nbsp;обновить текущую страницу. Это уже давно правильно работает. Теперь вот проблема.

миграция

Как многие могут знать, Chrome не поддерживаетApplets. Который был отложен на некоторое время, так какIE&nbsp;а такжеFireFox&nbsp;все еще поддерживал их. В конце 2016 года они также больше не будут их поддерживать. Поэтому мы решили перенести апплет с помощьюJWS&nbsp;а такжеJNLP.

Перенос этого простого примера кнопки перенаправления дал бы следующееhtml&nbsp;фрагмент иJNLP&nbsp;файл:

<a href="${jnlpUrl}">Launch JNLP</a>

${jnlpUrl}&nbsp;возвращает местоположение вJNLP&nbsp;файл который:

<?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&nbsp;приложение. Позволяет использовать его из любого браузера, поскольку он выполняется вне его. Что также является своего рода проблемой.

Эта проблема

ЛинияgetAppletContext().showDocument(new URL(target), "_parent");&nbsp;по-прежнему выполняет перенаправление, но использует браузер по умолчанию, как указано вмиграционная документация.

Для AppletContext.showDocument (URL-адрес, String target) аргумент target будет игнорироваться технологией Java Web Start.

Подобно AppletContext.showDocument, приложения Java Web Start способны отображать HTML-страницу с помощью системного веб-браузера по умолчанию с помощью API-интерфейса BasicService.showDocument.

Так что, если моим браузером по умолчанию является FireFox, но я случайно перехожу к этомуJWS-enabled applet&nbsp;в IE / Chrome будет открыта новая вкладка в FireFox. Это проблема, поскольку у меня есть информация (например, логин), сохраненная в исходном браузере!

Выводы

Поскольку приложение работает за пределами браузера, у меня возникают проблемы с возможностью обратной связи с исходным браузером. Я не могу использоватьJavaScript&nbsp;так как он не работает в браузере. Я не могу определить независимый от системы способ открытия вкладки в исходном браузере. Я также думал оWebSockets&nbsp;так как они могли бы разрешить прямое общение, но из того, что я прочитал, это довольно высокий уровень и требует сервера, а не простого апплета.

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