Cómo comunicarse entre el navegador y el applet Java Web Start
Situación actual
Actualmente utilizamos un applet para realizar algunas operaciones, después de lo cual redirige la página actual. En su núcleo, puede ver el applet de la siguiente manera:
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) {}
});
}
}
con el applet llamado de la manera más simple:
<applet code="com.example.applet.ExampleApplet.class" archive="${appletUrl}" width="100" height="30">
<param name="targetPage" value="http://localhost:8080/applet/"/>
</applet><br/><br/>
dónde${appletUrl}
devuelve la ubicación del applet JAR.
Entonces el applet no es más que un simple botón que llamagetAppletContext().showDocument(new URL(target), "_parent");
para actualizar la página actual. Esto ha hecho su trabajo correctamente durante mucho tiempo. Ahora aquí está el problema.
Migración
Como muchos sabrán, Chrome no es compatibleApplet
s. Que se dejó de lado por un tiempo desdeIE
yFireFox
Todavía los apoyé. A finales de 2016, ya no los apoyarán. Entonces decidimos migrar el applet usandoJWS
yJNLP
.
La migración de este sencillo ejemplo de botón de redireccionamiento daría lo siguientehtml
fragmento yJNLP
archivo:
<a href="${jnlpUrl}">Launch JNLP</a>
${jnlpUrl}
devuelve la ubicación aJNLP
archivo que es:
<?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>
Hasta ahora todo bien, el mismo applet se implementa con éxito comoJWS
solicitud. Permitir que se use desde cualquier navegador ya que se ejecuta fuera de él. Lo cual también es una especie de problema.
El problema
La líneagetAppletContext().showDocument(new URL(target), "_parent");
todavía hace una redirección, pero está usando el navegador predeterminado como se indica en eldocumentación de migración.
Para AppletContext.showDocument (URL url, destino de cadena), la tecnología Java Web Start ignorará el argumento objetivo.
De forma similar a AppletContext.showDocument, las aplicaciones Java Web Start pueden mostrar una página HTML utilizando el navegador web predeterminado del sistema mediante la API BasicService.showDocument.
Entonces, si mi navegador predeterminado es Firefox, pero estoy navegando hacia estoJWS-enabled applet
en IE / Chrome, se abrirá una nueva pestaña en Firefox. ¡Esto es un problema, ya que tengo información (por ejemplo, inicio de sesión) almacenada en el navegador original!
Recomendaciones
Como la aplicación se ejecuta fuera del navegador, tengo problemas para pensar en las posibilidades de comunicarme de nuevo con el navegador original. No puedo usarJavaScript
ya que no se ejecuta dentro del navegador. Realmente no puedo definir una forma independiente del sistema para abrir una pestaña en el navegador original. También he pensado enWebSockets
ya que podrían permitir la comunicación directa, pero por lo que he leído es bastante de alto nivel y requiere un servidor, no un simple applet.
¿Existe alguna posibilidad de comunicarse entre el navegador original (por ejemplo, websockets y parámetros) o pasar la sesión de un navegador a otro cuando el applet abre una nueva ventana?