Question

J'ai créé une applet de base dans laquelle l'utilisateur sélectionne un fichier sur son disque dur, lit la première ligne de ce fichier et le transmet à JavaScript pour un prétraitement supplémentaire, puis lorsque vous cliquez sur un bouton, il essaie pour télécharger ce fichier via une requête HTTP POST. J'ai trouvé un applet open source très basique pour le téléchargement de fichiers que j'ai copiés et modifiés pour ce dernier bit.

Le problème, c’est que cela ne fonctionne pas tout à fait. Il semble que tout fonctionne bien, mais je rencontre deux problèmes liés aux autorisations. Les messages de la console Java indiquent que l'applet avait des erreurs d'accès refusé sur les deux autorisations suivantes:

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

Je trouve cela étrange, car je pensais que j'avais déjà accordé la permission à l'applet lorsque je l'avais construite avec l'option "auto-signé". option cochée dans NetBeans, puis cliquée pour confirmer la petite fenêtre contextuelle de sécurité dans le navigateur.

De plus, la partie que j'ai moi-même codée, où il lit le fichier et passe la première ligne à JavaScript, fonctionne bien. C'est un indicateur assez clair que l'applet est capable de lire à partir du système de fichiers local! Le problème ne commence pas tant que je n'ai pas essayé de démarrer le téléchargement. Une chose à noter, je suppose, est que le processus de téléchargement semble s’exécuter dans un nouveau thread, alors que le reste s’exécute dans la classe principale sans créer de thread.

Je suis un novice en Java et je connais très peu les threads en Java. Ai-je besoin de passer les autorisations sur ce nouveau fil d'une manière ou d'une autre? Ou quelque chose à cet effet? Merci d'avance.

Était-ce utile?

La solution

Vous devez probablement demander au responsable de la sécurité (code, et non administrateur) la permission d'effectuer une opération privilégiée. Pour diverses raisons, ce n’est généralement pas une bonne chose pour un applet de pouvoir ouvrir un fichier local, il est donc très surveillé.

La clé de base est d'appeler AccessController.doPrivileged () et il existe un bon petit tutoriel sur la FAQ de Java Ranch.

Autres conseils

J'ai eu un problème similaire qui a pris une éternité à résoudre. Il s'avère que les méthodes d'applets appelées à partir de JavaScript ne disposent d'aucune autorisation, même si vous les leur accordez explicitement dans un fichier de stratégie.

Cette solution de contournement a fonctionné pour moi (l'ajout de commandes à une file d'attente parcourue par l'applet): http://blog.carrythezero.com/?p=5

Assurez-vous que vous comprenez les dangers ici: tout le monde peut modifier JavaScript sur une page et changer les informations introduites dans l'applet. Dans mon cas, je sais que le code ne va jamais sur un serveur Web et que la classe n'est pas signée. Elle échouera sauf si l'emplacement indiqué par mon fichier de règles est spécifique.

C'est probablement parce que le JavaScript n'est pas signé. Je suggère fortement de ne pas signer le code, surtout si vous ne savez pas ce que vous faites. A partir de 6u10 (pas encore sur Mac), les applets peuvent utiliser JNLP, y compris FileOpenService, pour vous éviter de signer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top