Java Applet assinado lança a exceção de segurança no Connect a um serviço da web
-
21-09-2019 - |
Pergunta
Eu tenho um applet Java em execução no Tomcat 5.5. É assinado (-SelfCert). Eu ainda recebo um java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)
Exceção, quando meu applet tenta se conectar a um serviço da web (já nesta linha):
ws_locator = new My_WebserviceLocator(ws_adress + "?wsdl",
new javax.xml.namespace.QName("http://impl.webservice", "My_Webservice"));
Como existem algumas perguntas semelhantes aqui, e eu as li:
Sim, o applet está assinado. Eu verifiquei com -verify.
Exceção de segurança do Tomcat, pode ser, mas eu adicionei ao Catalina.policy:
grant codeBase "file:/home/me/apache-tomcat-5.5.27/webapps/myapplet/-" { permission java.security.AllPermission; };
grant codeBase "file:/home/me/apache-tomcat-5.5.27/webapps/myapplet/applet.jar" { permission java.security.AllPermission; };
E as coisas usuais como também estão lá:
grant codeBase "file:${java.home}/jre/lib/ext/-" {
permission java.security.AllPermission;
};
sem resultado.
Ok, atualização rápida, adicionando:
grant{
permission java.security.AllPermission;
};
Para o arquivo java.policy local corrige o problema. Mas não é isso que estou procurando, o applet deve ser executado em uma máquina Avarage, com o arquivo dafault java.policy. Portanto, ele deve ser corrigido dentro do código.
Solução
Você chama seu WS do tópico principal do applet ou de um thread iniciado por uma chamada para o método do applet usando JavaScript?
Veja o exemplo abaixo.
Espero que ajude.
public class MyApplet extends JApplet {
@Override
public void start() {
// It will work if your applet is signed
callWebService();
}
public void methodCalledFromJavascriptWrong() {
// It will NOT work even if your applet is signed
callWebService();
}
public void methodCalledFromJavascriptGood() {
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
// It will work if your applet is signed
callWebService();
return null;
}
});
}
private void callWebService() {
//Here you call your web service
}
}
Outras dicas
Definir permissões no servidor não é a solução. É o gerente de segurança no navegador que reclama.
O uso proposto do AccessManager é obrigatório ou isso falhará. Mas você também precisa fazer o mesmo ao ligar para o WebService de Start () ou init ().
Posso perguntar: o serviço da web é o único motivo pelo qual você tem um applet? Pode ser melhor estabelecer um servlet proxy para evitar as mesmas restrições de políticas de domínio. Em seguida, você pode usar o HTML + JavaScript puro no navegador.
Chamar um applet do JS pode falhar se você fizer isso antes que o applet seja totalmente iniciado, portanto, você deve esperar que o applet esteja pronto.
Se você estiver usando outras bibliotecas (potes) do seu applet, isso se interrompa com qualquer recurso restrito, elas também devem ser assinadas. Então, dê todo o Stacktrace e o My_WebServiceLocator. (E não use sublinhados). Por exemplo, tente assinar o eixo.jar.
Como um solução alternativa temporária, você pode desativar o SecurityManager. É claro que isso tem alguns problemas de segurança, mas pelo menos você poderá acompanhá -lo ao SecurityManager (ou seja, um problema de permissões).
System.setSecurityManager(null);
Se isso realmente funciona, meu palpite é que você está configurando o arquivo de política errado. Ao executar um applet do navegador, estou quase Claro que o Applet Launcher será um consumidor regular JRE, não o JRE empatado com o JDK.