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ützApplet
s. 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?