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

questionAnswers(2)

yourAnswerToTheQuestion