Domanda

Ho messo insieme un'applet di base in cui l'utente seleziona un file dal proprio disco rigido, legge la prima riga di questo file e lo passa a JavaScript per qualche ulteriore preelaborazione, quindi quando fa clic su un pulsante prova per caricare quel file tramite una richiesta POST HTTP. Ho trovato un'applet open source molto semplice per il caricamento di file che ho copiato e modificato per quest'ultimo bit.

Il problema è, tuttavia, che non funziona del tutto. Sembra che funzioni bene, ma poi mi imbatto in due ostacoli relativi alle autorizzazioni. I messaggi nella console Java indicano che l'applet ha avuto errori di accesso negato nelle seguenti due autorizzazioni:

java.lang.RuntimePermission setFactory
java.io.FilePermission read

Lo trovo strano, perché pensavo di aver già concesso l'autorizzazione all'applet quando l'ho costruito con il "quotato autofirmato" l'opzione è stata selezionata in NetBeans, quindi ha fatto clic per confermare il piccolo popup di sicurezza nel browser.

Inoltre, la parte che ho codificato io stesso, dove legge il file e passa la prima riga su JavaScript funziona bene. Questo è un indicatore abbastanza chiaro che l'applet è in grado di leggere dal file system locale! Il problema non inizia finché non provo effettivamente ad avviare il caricamento. Una cosa da notare, suppongo, è che il processo di upload sembra funzionare in un nuovo thread, mentre il resto di tutto viene eseguito nella classe principale senza creare thread.

Sono un principiante assoluto di Java e so molto poco sui thread in Java; devo in qualche modo passare le autorizzazioni su questo nuovo thread? O qualcosa in tal senso? Grazie in anticipo.

È stato utile?

Soluzione

Probabilmente devi chiedere al gestore della sicurezza (codice, non amministratore) l'autorizzazione per eseguire un'operazione privilegiata. Per vari motivi, in genere non è una buona cosa che un'applet sia in grado di aprire un file locale, quindi è protetta abbastanza pesantemente.

La chiave di base è chiamare AccessController.doPrivileged () e c'è un buon piccolo tutorial su di esso alle Domande frequenti su Java Ranch.

Altri suggerimenti

Ho avuto un problema simile che ha impiegato un'eternità a risolversi. Risulta che i metodi di applet chiamati da JavaScript non hanno autorizzazioni, anche se li concedi esplicitamente in un file di criteri.

Questa soluzione ha funzionato per me (aggiungendo comandi a una coda attraverso la quale scorre l'applet): http://blog.carrythezero.com/?p=5

Assicurati di comprendere i pericoli qui: chiunque può modificare JavaScript su una pagina e cambiare ciò che viene inserito nell'applet. Nel mio caso, so che il codice non viene mai utilizzato su un server Web e la classe non è firmata, pertanto non riuscirà a meno che non si trovi nella posizione specifica concessa dal mio file delle politiche.

Probabilmente è perché JavaScript non è firmato. Consiglio vivamente di non firmare il codice, in particolare se non sai cosa stai facendo. Da 6u10 (non ancora su Mac) le applet possono usare JNLP incluso FileOpenService, quindi non è necessario firmare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top