Como se comunicar entre o navegador e o applet Java Web Start
Situação atual
Atualmente, usamos um applet para executar algumas operações, após o que redireciona a página atual. No seu núcleo, você pode ver o applet da seguinte maneira:
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) {}
});
}
}
com o applet sendo chamado da maneira mais simples:
<applet code="com.example.applet.ExampleApplet.class" archive="${appletUrl}" width="100" height="30">
<param name="targetPage" value="http://localhost:8080/applet/"/>
</applet><br/><br/>
Onde${appletUrl}
retorna a localização do applet JAR.
Portanto, o applet nada mais é do que um simples botão que chamagetAppletContext().showDocument(new URL(target), "_parent");
para atualizar a página atual. Isso fez seu trabalho corretamente por um longo tempo. Agora, aqui está o problema.
Migração
Como muitos sabem, o Chrome não suportaApplet
s. Que foi posta de lado por um tempo desdeIE
eFireFox
ainda os apoiava. No final de 2016, eles também não os apoiarão mais. Então decidimos migrar o applet usandoJWS
eJNLP
.
A migração deste exemplo simples de botão de redirecionamento daria o seguintehtml
trecho eJNLP
Arquivo:
<a href="${jnlpUrl}">Launch JNLP</a>
${jnlpUrl}
retorna o local para oJNLP
arquivo que é:
<?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>
Até aí tudo bem, o mesmo applet é implantado com êxito como umJWS
inscrição. Permitindo que ele seja usado em qualquer navegador, pois é executado fora dele. O que também é o tipo de problema.
O problema
A linhagetAppletContext().showDocument(new URL(target), "_parent");
ainda faz um redirecionamento, mas está usando o navegador padrão, conforme indicado nodocumentação de migração.
Para AppletContext.showDocument (URL da URL, destino da String), o argumento de destino será ignorado pela tecnologia Java Web Start.
Semelhante ao AppletContext.showDocument, os aplicativos Java Web Start são capazes de mostrar uma página HTML usando o navegador da web padrão do sistema, usando a API BasicService.showDocument.
Portanto, se meu navegador padrão for o FireFox, mas eu estiver navegando para esteJWS-enabled applet
no IE / Chrome, uma nova guia será aberta no FireFox. Isso é um problema, pois tenho informações (por exemplo, login) armazenadas no navegador original!
Constatações
Como o aplicativo está sendo executado fora do navegador, estou tendo problemas para pensar em possibilidades de comunicação com o navegador original. Não posso usarJavaScript
já que não é executado no navegador. Na verdade, não consigo definir uma maneira independente do sistema de abrir uma guia no navegador original. Eu também pensei emWebSockets
como eles podem permitir a comunicação direta, mas pelo que li, é de alto nível e requer um servidor, não um simples applet.
Existe a possibilidade de se comunicar entre o navegador original (por exemplo, websockets e parâmetros) ou passar a sessão de um navegador para outro quando o applet abre uma nova janela?