2009-03-06 14 views
5

Ho creato 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 pre-elaborazione, e quindi quando si fa clic su un pulsante tenta di caricare quel file attraverso una richiesta HTTP POST. Ho trovato un'applet open source molto semplice per caricare file che ho copiato e modificato per quest'ultimo bit.Autorizzazioni applet Java

Il problema è che, tuttavia, non funziona. Sembra che stia funzionando bene, ma poi mi imbatto in due problemi relativi alle autorizzazioni. I messaggi nella Console Java dire che l'applet ha avuto accesso negato errori sui seguenti due permesso:

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

Lo trovo strano, perché pensavo di aver concesso il permesso di l'applet già quando ho costruito con il " opzione autofirmata "selezionata in NetBeans, quindi fa clic per confermare la piccola finestra di sicurezza nel browser.

Inoltre, la parte che ho codificato da sola, dove legge il file e passa la prima riga su JavaScript funziona correttamente. Questo è un indicatore abbastanza chiaro che l'applet è in grado di leggere dal file system locale! Il problema non si avvia finché non provo effettivamente ad avviare il caricamento. Una cosa da notare, suppongo, è che il processo di caricamento 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 conosco molto poco sui thread in Java; ho bisogno di passare le autorizzazioni su questo nuovo thread in qualche modo? O qualcosa in tal senso? Grazie in anticipo.

risposta

3

Probabilmente è necessario chiedere al responsabile della sicurezza (codice, non amministratore) il permesso di eseguire un'operazione con privilegi. Per vari motivi, in genere non è consigliabile che un'applet sia in grado di aprire un file locale, quindi è piuttosto protetto.

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

+0

doPrivileged è estremamente pericoloso. Come sta firmando le applet. –

+3

Come consentire alle applet di leggere i file. Nondimeno, è lì e la risposta alla domanda. –

0

Probabilmente è perché il codice JavaScript non è firmato. Suggerisco caldamente 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 il FileOpenService, quindi non devi firmare.

+0

non JavaScript; Giava. – Ricket

+0

La domanda dice che è coinvolto JavaScript. La mia ipotesi istruita è che il suo JavaScript nel contesto del controllo accessi che sta causando il problema. –

1

Ho avuto un problema simile che è durato per sempre. Risulta che i metodi di applet chiamati da JavaScript non hanno autorizzazioni, anche se li si concede esplicitamente in un file di criteri.

Questa soluzione ha funzionato per me (l'aggiunta di comandi a una coda, che l'applet scorre): http://blog.carrythezero.com/?p=5

Accertarsi di aver capito i pericoli qui: chiunque può modificare JavaScript su una pagina e cambiare quello che sta facendo immessa nella applet. Nel mio caso, so che il codice non sta mai andando su un server web, e la classe non è firmata, quindi fallirà se non nella posizione specifica concessa dal mio file di criteri.

Problemi correlati