Applet não conecta ao MySQL

Pessoal, desenvolvi uma aplicação em que realiza uma conexão a um banco de dados via mysql atravéns de um applet. No eclipse, ele rodou sem problemas, mas quando vou executá-lo no browser, dá o seguinte erro:

[code]** BEGIN NESTED EXCEPTION **

java.security.AccessControlException
MESSAGE: access denied (java.net.SocketPermission mysql.inf.ufsc.br resolve)

STACKTRACE:

java.security.AccessControlException: access denied (java.net.SocketPermission mysql.inf.ufsc.br resolve)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkConnect(Unknown Source)
at java.net.InetAddress.getAllByName0(Unknown Source)
at java.net.InetAddress.getAllByName0(Unknown Source)
at java.net.InetAddress.getAllByName(Unknown Source)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:133)
at com.mysql.jdbc.MysqlIO.(MysqlIO.java:280)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:1765)
at com.mysql.jdbc.Connection.(Connection.java:430)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:268)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at ecfv.sql.SQL.(SQL.java:22)
at ecfv.consulta.sql.ConsultaSQL.(ConsultaSQL.java:15)
at ecfv.consulta.Consulta.realizaConsulta(Consulta.java:107)
at ecfv.consulta.Consulta$1.run(Consulta.java:86)
at java.lang.Thread.run(Unknown Source)

** END NESTED EXCEPTION **

at com.mysql.jdbc.Connection.createNewIO(Connection.java:1830)
at com.mysql.jdbc.Connection.<init>(Connection.java:430)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:268)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at ecfv.sql.SQL.<init>(SQL.java:22)
at ecfv.consulta.sql.ConsultaSQL.<init>(ConsultaSQL.java:15)
at ecfv.consulta.Consulta.realizaConsulta(Consulta.java:107)
at ecfv.consulta.Consulta$1.run(Consulta.java:86)
at java.lang.Thread.run(Unknown Source)

[/code]

Detalhe que é um applet assinado e o driver jdbc do mysql está carregado no classpath. Uso a seguinte versão: mysql-connector-java-3.1.7-bin.jar

Desde já, obrigado!

Não basta só assinar o applet; eu ainda não sei exatamente quando (o porquê eu até sei, mas não o quando) é necessário fazer algo como:

public class NoSecurityManager extends SecurityManager {
    public void checkPermission(Permission perm, Object context) {
    }
    public void checkPermission(Permission perm) {
    }
}

… e na hora de chamar o seu código:

         if (System.getSecurityManager() == null) {
            System.setSecurityManager(new NoSecurityManager());
        }
        AccessController.doPrivileged(new PrivilegedAction() {
            public Object run() {
                // chame o seu código privilegiado aqui
                ...
                return new Object();
            }
        });

Isto é para Sun Plug-In. Para Microsoft JVM é necessário fazer algo como:

            PolicyEngine.assertPermission(PermissionID.SYSTEM);

A Microsoft JVM tem uma coisa muito esquisita - essa permissão só vale dentro do escopo da função em que é chamada. Quando a função retorna, a permissão não vale mais.

E, como de costume vou dar aquele puxão de orelha amigo:

  • Não acesse bases de dados em um applet. Deixe isso para o servidor (web container, como o Tomcat ou o Jetty, ou application container, como o JBoss, J2EE Reference Implementation, Websphere, Weblogic, Sun Java App. Server etc.)

Bom, valeu pelas dicas ai thingol, por mim eu até faria em tipo jsp e tal, o problema eh q eu nao sei nada de j2ee… e como eu nao tenho mto tempo para estudar, resolvi fazer em applet msm…

Putz, fiz exatamente o q voce disse e nao consegui nada, estou usando o driver jdbc do mysql 3.1.7 e java 5

	public void actionPerformed( ActionEvent e ) {
		if ( !campoTexto.getText().matches( "[a-z0-9]{15}" ) )
			JOptionPane.showMessageDialog( this, "Dados digitados inválidos.\nCertifique-se que você tenha digitado corretamente.", "Dados inválidos.", JOptionPane.ERROR_MESSAGE );
		else {
			if ( System.getSecurityManager() == null )
				System.setSecurityManager( new ConsultaSecurityManager() );
			
			AccessController.doPrivileged( this );
		}
	}

No Java 5, uma coisa que ajuda para você testar é limpar o cache de applets sempre que possível, ou então desabilitar o cache. Pode ser que você esteja usando uma versão velha do applet :wink:

Pegue no Control Panel (estou supondo que você esteja usando Windows; no Linux não sei onde fica o Control Panel do Java, mas não deve ser impossível de encontrar) o ícone Java (não é o Java Plugin 1.4: é o ícone Java sozinho), em Temporary Internet Files, clique Settings, clique View Applets, limpe os applets que estão no cache (marque e clique Delete), e desmarque o [X] Enable Caching).
A seguir, feche todas as janelas do browser, feche o tray icon do Java se ele estiver presente, e entre novamente.