Problema Java-Mysql bridge

2 risposte [Ultimo messaggio]
Ritratto di MacGyver
MacGyver
(Geek)
Offline
Geek
Iscritto: 23/05/2007
Messaggi: 88

Ciao a tutti!
Stavo provando a creare un'applet java per il mio sito internet. Questa applet si deve connettere ad un database mysql per poi prendere i nomi e l'indirizzo delle foto in modo da visualizzarli sullo schermo.

Prima di iniziare la parte grafica ho fatto una prova creando un'applicazione che funzionasse solo a riga di comando, il cui semplicissimo compito era di collegarsi al database, riempire questi array e stamparli a video. E fin qui tutto a posto.

Comincio allora a programmare l'applet (uso NetBeans) faccio il form e tutto, controllo che la visualizzazione sia quella che mi aspetto, e poi inserisco il codice per la connessione al database. È allora che Firefox si impianta. Dopo numerosi tentativi sono riuscito a risalire all'errore. È un'eccezione da quintale:

<br />com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: <br /><br />** BEGIN NESTED EXCEPTION ** <br /><br />java.net.SocketException<br />MESSAGE: java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:3306 connect,resolve)<br /><br />STACKTRACE:<br /><br />java.net.SocketException: java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:3306 connect,resolve)<br />      at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:156)<br />   at com.mysql.jdbc.MysqlIO.&lt;init&gt;(MysqlIO.java:284)<br />  at com.mysql.jdbc.Connection.createNewIO(Connection.java:2555)<br />    at com.mysql.jdbc.Connection.&lt;init&gt;(Connection.java:1485)<br />   at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)<br />     at java.sql.DriverManager.getConnection(DriverManager.java:582)<br />   at java.sql.DriverManager.getConnection(DriverManager.java:185)<br />   at PhotoAlbum.init(PhotoAlbum.java:33)<br />    at org.kde.kjas.server.KJASAppletStub$RunThread.doState(KJASAppletStub.java:196)<br />  at org.kde.kjas.server.KJASAppletStub$RunThread.run(KJASAppletStub.java:255)<br /><br /><br />** END NESTED EXCEPTION **<br /><br /><br /><br />Last packet sent to the server was 768 ms ago.<br />

Ho cercato su google ma ho fatto solo più casino: da una parte mi dicono che serve configurare il file "policy" di tomcat. Ma io non uso tomcat...
Nel sito della MySql mi dicono che le applet java non funzionano se vengono eseguite dal computer che le contiene, ma solo se sono sul server remoto. Ed allora faccio l'upload dell'applet nel sito, ma l'errore si ripete...

Qualcuno ha già fronteggiato un errore simile? Come me la posso cavare? Se è realmente un errore di settaggio delle "policy", allora dovrei dire all'amministratore del servizio di hosting di aprire le porte solo per me??
E soprattutto: perché mai la riga di comando funziona e la applet no???

Grazie a chi avrà qualche risposta (ed anche a chi è riuscito ad arrivare fino a qui)

Ritratto di orion
orion
(Guru)
Offline
Guru
Iscritto: 11/07/2006
Messaggi: 2919

Ci hai quasi preso quando hai letto la parola "policy".

Probabilmente non sai che quando fai partire un programma java, la jvm instanzia in automatico un policy manager (se non viene instanziato dal programma stesso) che autorizza o nega qualsiasi operazione il programma vuole fare.
Le operazioni sotto controllo del policy manager sono tutte quelle potenzialmente pericolose, ad esempio caricamento a runtime di una classe, recupero da remoto di una classe, apertura e chiusura file, apertura di connessioni di rete.

Il policy manager e` configurato attraverso un file di policy che dichiara cosa e` permesso. Se non mi ricordo male, dovrebbe essere negato tutto cio` che non e` espressamente consentito (e questa e` un buon metodo di lavoro, anche nella configurazione dei firewall). Per i programmi eseguiti da riga di comando, il policy di default permette quasi tutto. Questo perche` se tu lanci volutamente un programma, vuol dire che ti fidi di esso e del suo comportamento.

Anche le applet sono soggette a questo policy manager, ma in questo caso il file di policy e` molto piu` stringente, in quanto il codice che arriva viene eseguito in automatico e non per espressa volonta` dell'utente.
Il file di policy usato dai browser di solito nega qualsiasi accesso ai file locali come pure dovrebbe negare (se mi ricordo bene) l'accesso a tutti i siti che non siano quello da cui l'applet arriva. Per ovviare a questo problema, si puo` firmare l'applet che quindi verra` trattata come "trusted", ossia il policy manager la considera come se fosse fidata e rilassa le condizioni come se fosse lanciata manualmente.

A parte tutti questi discorsi, c'e` da dire che non e` una buona idea avere un'applet che si collega direttamente ad un database. Questo perche` devi permettere l'accesso a tutti attraverso il firewall e soprattutto perche` username e password di accesso vengono scritte dentro l'applet, quindi chiunque puo` estrarle, accedere al database e farne scempio.

Per maggiori info:
http://java.sun.com/j2se/1.5.0/docs/guide/security/
http://java.sun.com/developer/technicalArticles/Security/applets/
http://forums.sun.com/thread.jspa?threadID=591209&messageID=3083573

openSUSE 12.1 on Acer Aspire 1810tz - LXDE ultima versione dal repo x11:/lxde

Ritratto di MacGyver
MacGyver
(Geek)
Offline
Geek
Iscritto: 23/05/2007
Messaggi: 88

Capito! Ho guardato le pagine che mi hai proposto ed ho trovato che la soluzione riguardante la "servlet" può fare al caso mio.
Ora finirò di guardare tutto con più calma e poi riproverò ancora!
Grazie mille!