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 :
- pour effacer mon répertoire:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
Dans le 1er cas, le dossier est bien effacé, dans le 2nd, je reçois une exception :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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()); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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"
Un grand merci à qui pourra m'aider!![]()
![]()
David
Partager