1 pièce(s) jointe(s)
"delete" ne fonctionne plus lorsque JavaScript appelle une applet signée
:salut:
note :
- Developement sous Java 1.4.2
- Execution (applet)sous 1.6.0
- Navigateur : IE exclusivement (dès version 5/6)
Je viens de chercher un bon moment sans succès. J'ai développé une applet signée qui copie et modifie des fichiers PDF sur le disque de l'utilisateur.
Dans une classe "utils", une fonction "deleteDir()" est appelée à deux endroits de mon code:
- elle est appelée depuis l'Applet pour effacer un dossier de travail temporaire lors d'une annulation de l'opération en cours.
- elle est appelée depuis la page web via une fonction JavaScript lorsqu'on souhaite annuler les modifications et quitter l'Applet.
Une capture de l'applet est en pièce jointe.
Voici le code :
- appelé par JavaScript :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| // --- used by JavaScript in web page
public boolean cancelRequest(){
boolean isCancelOk = true;
System.out.println("[cancelRequest - 1]");
if (!getDataDesc().isUpdateOriginalData()
&& getDataDesc().getOutputDirectory().isDirectory()
&& !getDataDesc().isCancelCopy())
try {
System.out.println("[cancelRequest - 2]");
Utils.deleteDir(getDataDesc().getOutputDirectory());
System.out.println("[cancelRequest - 3]");
} catch (Exception e) {
isCancelOk = false;
e.printStackTrace();
}
System.out.println("[cancelRequest - 4]");
return isCancelOk;
} |
- pour effacer mon répertoire:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public synchronized static void deleteDir(File theDirectory) throws Exception {
if( theDirectory.exists() ) {
File[] files = theDirectory.listFiles();
for(int i=0; i<files.length; i++) {
if(files[i].isDirectory())
// delete directory
deleteDir(files[i]);
else
// delete file
if (!files[i].delete())
throw new Exception(files[i].getAbsolutePath());
}
}
if (!theDirectory.delete())
throw new Exception(theDirectory.getAbsolutePath());
} |
Dans le 1er cas, le dossier est bien effacé, dans le 2nd, je reçois une exception :
Code:
1 2 3 4 5 6 7 8 9 10 11
| Exception in thread "Thread-16"
[cancelRequest - 1]
[cancelRequest - 2]
java.security.AccessControlException: access denied (java.io.FilePermission D:\samples\add_bookmarks\100_out read)
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.checkRead(Unknown Source)
at java.io.File.isDirectory(Unknown Source)
at org.epo.bli.gui.user.pdfApplet.MainClass$1.run(MainClass.java:141)
at java.lang.Thread.run(Unknown Source) |
La question est "simple" ( la réponse aussi?)...
Pourquoi l'applet peut-elle effacer mon dossier lorsqu'elle est appelée directement par un bouton et pourquoi ne le peut-elle pas quand la méthode est appelée depuis JavaScript? Java détecte-t-il l'origine de l'appel? Comment pallier à ceci?
Note: j'ai essayé un "System.setSecurityManager(null); " dans le thread utilisé pour la suppression du cas 2 - appel depuis JavaScript. Résultat : Une exception, "pas le droit" :aie:
Un grand merci à qui pourra m'aider! :D :D :D
David