Wie kommuniziert man zwischen Browser und Java Web Start-Applet?

Momentane Situatio

Wir verwenden derzeit ein Applet, um einige Vorgänge auszuführen. Anschließend wird die aktuelle Seite umgeleitet. Im Kern könnte das Applet folgendermaßen aussehen:

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) {}
        });
    }
}

wenn das Applet auf einfachste Weise aufgerufen wird:

<applet code="com.example.applet.ExampleApplet.class" archive="${appletUrl}" width="100" height="30">
    <param name="targetPage" value="http://localhost:8080/applet/"/>
</applet><br/><br/>

wo${appletUrl} gibt den Speicherort der Applet-JAR zurück.

Das Applet ist also nichts anderes als eine einfache Schaltfläche, die @ aufrufgetAppletContext().showDocument(new URL(target), "_parent");, um die aktuelle Seite zu aktualisieren. Dies hat seine Arbeit für eine lange Zeit richtig gemacht. Hier ist das Problem.

Migratio

Wie viele vielleicht wissen, wird @ von Chrome nicht unterstützApplets. Was seit @ für eine Weile beiseite gelegt wurIE undFireFox hat sie immer noch unterstützt. Ende 2016 werden sie sie auch nicht mehr unterstützen. Also haben wir beschlossen, das Applet mit @ zu migriereJWS undJNLP.

enn Sie dieses einfache Beispiel für eine Umleitungsschaltfläche migrieren, erhalten Sie das folgendehtml Snippet undJNLP Datei

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

${jnlpUrl} gibt den Ort an das @ zurüJNLP Datei, die ist:

<?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>

So weit so gut, dasselbe Applet erfolgreich als @ implementiert wiJWS Anwendung. Ermöglichen, dass es von jedem Browser aus verwendet werden kann, da es außerhalb des Browsers ausgeführt wird. Welches ist auch Art des Problems.

Das Proble

Die LiniegetAppletContext().showDocument(new URL(target), "_parent"); führt weiterhin eine Umleitung durch, verwendet jedoch den im @ angegebenen Standardbrowsemigration documentation.

Bei AppletContext.showDocument (URL-URL, String-Ziel) wird das Zielargument von der Java Web Start-Technologie ignoriert.

Im Gegensatz zu AppletContext.showDocument können Java Web Start-Anwendungen eine HTML-Seite mit dem Standardwebbrowser des Systems mithilfe der BasicService.showDocument-API anzeigen.

So wenn mein Standardbrowser FireFox ist, ich aber zufällig zu diesem @ navigieJWS-enabled applet In IE / Chrome wird in FireFox ein neuer Tab geöffnet. Dies ist ein Problem, da ich Informationen (z. B. Login) im ursprünglichen Browser gespeichert habe!

Ergebniss

Da die Anwendung außerhalb des Browsers ausgeführt wird, habe ich Probleme, Möglichkeiten zur Kommunikation mit dem ursprünglichen Browser zu finden. Ich kann @ nicht verwendJavaScript da es nicht im Browser läuft. Ich kann keine systemunabhängige Methode zum Öffnen einer Registerkarte im ursprünglichen Browser definieren. Ich habe auch an @ gedacWebSockets da sie direkte Kommunikation ermöglichen könnten, aber von dem, was ich gelesen habe, ist es ziemlich hoch und erfordert einen Server, kein einfaches Applet.

Gibt es eine Möglichkeit, zwischen dem ursprünglichen Browser (z. B. Websockets und Parametern) zu kommunizieren oder die Sitzung von einem Browser auf einen anderen zu übertragen, wenn das Applet ein neues Fenster öffnet?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage