Accès refusé à l'écriture dans un fichier text.

cedbont
Accès refusé à l'écriture dans un fichier text.

Bonjour,
j'ai créé une applet Java sous Eclipse.
Quand j'ouvre le fichier .html, généré par l'exécution de mon fichier java dans Eclipse, avec IE7, j'obtiens tout d'abord une interdiction d'exécuter le contrôle ActiveX (que j'autorise). Puis j'obtiens dans la console Java :

java.security.AccessControlException: access denied (java.io.FilePermission Blabla.txt write)
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.checkWrite(Unknown Source)
at java.io.FileOutputStream.(Unknown Source)
at java.io.FileOutputStream.(Unknown Source)
at java.io.FileWriter.(Unknown Source)
at Inclusion12.initVariables(Inclusion12.java:119)
at Inclusion12.init(Inclusion12.java:164)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Comme vous pouvez le voir l'accès est denied à mon fichier Text.

Savez-vous comment en autoriser l'accès ?

Merci.

willbback
Re: Accès refusé à l'écriture dans un fichier text.

cedbont wrote:
Bonjour,
Puis j'obtiens dans la console Java :

java.security.AccessControlException: access denied (java.io.FilePermission Blabla.txt write)
...
Savez-vous comment en autoriser l'accès ?


Il est interdit de lire les fichiers locaux avec une applet sans que celle-ci soit signée. Il faut simplement que tu fasse un certificat pour ton appel et tout ira bien. Tu peux utilisé keytool (outil de Sun), puis tu utilise jarsigner pour signer le Jar. Une fois que tu auras accepter le certificat sur ton navigateur, tu auras accès à ce fichier....
Petite remarque, il serait bon de catcher l'exception car l'utilisateur de ton applet pourrait refuser le certificat...
Cordialement,
Willibback
cedbont

Merci de m'avir répondu, mais comment utilise-t-on keytool et jarsigner ?
Est-ce que ce sont des procédures ?
Je suis un peu perdu.

willbback

cedbont wrote:
Merci de m'avir répondu, mais comment utilise-t-on keytool et jarsigner ?
Est-ce que ce sont des procédures ?
Je suis un peu perdu.

keytool et jarsigner sont 2 outils fournis avec le jdk (ils se trouvent dans le répertoire bin).
Keytool va permttre de générer un certificat (ce certificat ne sera pas officiel, ce qui peut être un peu génant dans le cadre d'une applet sur un site public)
Les commandes à passer sont :
keytool -genkey -keyalg rsa -alias <ta_cle>
keytool -export -alias <ta_cle> -file <ton_certificat.crt>

Tu obtiens alors un fichier . C'est ce fichier qui va servir pour signer ton applet.
Une fois que tu as constitué le jar de ton applet, tu va pouvoir la signée
jarsigner <tonapplet.jar> <ta_cle>
Et voilà. Il faut, au chargement de l'applet accepter le certificat
Un lien avec le détail en anglais de l'opération :
http://www.captain.at/programming/java/
Cordialement,
Willbback
cedbont

Bon, je ne comprends pas vraiment.
Bêtement, en premier, je mets ça textuellement a début de mon programme (dans Eclipse) :

keytool -genkey -keyalg rsa -alias ;
keytool -export -alias -file ;
jarsigner ;

Mais Eclipse me souligne ces trois lignes en rouge : il y a un problème !

Donc j'essaie de voir le site que tu indiques. D'après ce que je comprends, il faut regarder les trois derniers encarts :
- le premier correspond à mon programme dans Eclipse.
- le second : je ne sais pas comment éditer un fichier html, celui que je lance avec IE7 est généré automatiquement par Eclipse.
- le troisième : j'ai bien vu ça sous Linux, mais je travaille sous Vista. Donc comment faire ?...

Je suis encore perdu mais on avance. Donc la prochaine étape, si je suis bien, c'est de rédiger le fichier html, ou bien est-ce que je suis à la masse ?

jrebillat

Je crois que tu progresses :)

Les trois commandes indiquées ne sont pas faites pour être insérées dans ton applet, mais normalement tapées dans une console de commande (sous DOS, en fait) et je ne sais pas comment on lance une console DOS sous Vista.
Par ailleurs, il y a surement un moyen de signer une applet en trois clics sous Eclipse. Il reste à trouver comment, ou avec quel plugin.

willbback
Pour lancer une commande sous Vista...

Bonjour,
Tu ouvre un explorateur, tu va dnas le répertoire où est installé ton JDK, tu va ensuite dans le répertoire bin.
Tu fait +click droit, tu obtiens le menu contextuel enrichi. Tu choisit alors "Ouvrir une fenêtre de commandes ici"
Puis tu tappe les commandes keytool et jarsigner indiqué.
Il reste également la possibilité de signer ton applet à l'aide d'un script Ant.
Concernant Eclipse, je n'ai pas trouvé de commande pour le faire de manière automatique. Mais tu peux créé une tâche externe pour générer le certificat (tu n'en n'auras besoin qu'une fois) avec keytool, une pour exporter le certificat et une troisième qui signera ton applet directement.
Voilà...

cedbont

Ouahou Wiiiiiiiillbback !

Ca marche. En fait, j'ai pas vraiment fait comme tu m'as dit (ça ne marchait pas et j'ai pas vraiment cherché pourquoi), mais j'ai fait un mix de ta méthode et de celle indiquée sur ce site :
http://www.developer.com/java/data/article.php/3303561
Et là ça marche (bon j'ai aussi tout copié le dossié avec tout qui concernait java hors de Program Files... je ne sais pas si ça joue, mais bon...

Le principal c'est que ça marche en perséverant.

Par contre, j'ai un autre problème maintenant : bien que je mette des setSize partout, mais il me mets une fenêtre toute petite où bien sur je ne vois rien ! Je pense que c'est dû aux "width=325 height=325".

Donc, je me demande comment faire pour que ce qui est affiché prenne les dimensions indiquées par les setSize de mon applet.

Voilà...

cedbont

Oui, c'est bien à cause du "width=325 height=325" parce qu'en mettant "width=1000 height=600" qui la taille maximale de ma fenêtre, je vois bien tout. Ce que je voudrais faire, c'est que la taille de la fenêtre ouverte par IE7 soit réglée par les setSize de mon programme.

willbback

cedbont wrote:
Ce que je voudrais faire, c'est que la taille de la fenêtre ouverte par IE7 soit réglée par les setSize de mon programme.

Je ne connais pas un moyen simple de faire celà.
Le plus simple, si tu appelles ton applet à partir d'une page dynamique( style jsp etc...) tu peux externalisé la taille de ton applet dans le fichier, et passer les paramètres à ton applet. Dans ce cas, tout marche.
Une autre solution est d'utiliser les bibliothèques netscape permettant de communiquer avec la page ouverte du navigateur (netscape.javascript.JSObject) . Tu pourras alors par javascript redimensionner l'objet applet. Mais celà entrainera un refraichissement de ton applet.
Si quelqu'un à d'autres idées ....
cedbont

Peut-on alors obtenir (par exemple avec une sorte de getSize) la taille de la fenêtre d'IE7 dans mon programme java, pour que je puisse en tenir compte et redimensionner l'affichage en fonction de la taille de la fenêtre d'IE7?

willbback

C'est plutôt mieux comme ça en effet. Tu as éventuellement les paramètres pour passer tes informations, car je ne sais plus si tu peux accéder à la taille définit dans ton objet (ça fait bien longtemps que j'ai abandonné les applets).
Ton applet étant signée, tu peux avoir accès à l'environnement graphique avec la méthode GraphicsEnvironment.getLocalGraphicsEnvironment()

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
DisplayMode dm = gd.getDisplayMode();
int height = dm.getHeight();
int width = dm.getWidth();

A tester....
cedbont

Cela n'a pas marché mais, de toute façon j'ai un problème plus grave je me pencherai dessus plus tard :

j'ai créé des boutons, des Labels et des TextFields. Ils sont suivis d'un repaint() qui me créé une zone de dessin avec des lignes, des points, etc... Mais je ne vois plus mes boutons !

Donc comment faire pour voir à la fois mes boutons et ma zone de dessin ?

cedbont

Rectification : je viens de comprendre pourquoi je ne voyais pas mes boutons. En fait, depuis le début de l'écriture de ce programme j'ai eu le même problème : je crée un affichage avec des boutons, je clique sur un bouton. Le programme, là, fait en sorte de tout effacer (removeAll();) et de créer un affichage approprié au choix que je viens de faire en cliquant. Sauf que jamais rien ne s'affichait ! Je devais changer la taille de la fenêtre en faisant un cliquer glisser sur un coin pour que s'affiche mon nouvel affichage ! Donc j'ai mis des setSize(width,height+1); setSize(width;height) (ce qui me fait automatiquement un changement de dimensions de la fenêtre) partout, sauf là où est apparu mon dernier problème.

Toujours est-il que je reste sur mon problème de redimensionnement de l'affichage de l'intérieur de ma fenêtre en fonction des dimensions de la fenêtre ! Je vais essayer de voir.

cedbont

Et bien malheureusement, ça ne marche pas :
ni :
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
DisplayMode dm = gd.getDisplayMode();
int height = dm.getHeight();
int width = dm.getWidth();

ni :
width=super.getSize().width;
heigth=super.getSize().height;

Voyez-vous une solution pour les dimensions de la fenêtre de IE7 ?

cedbont

J'a fait une applet de test pour comprendre ce que me donnait ce que tu as fait Willbback :

import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

public class Test extends Applet implements ActionListener {

Button test;
int largeur;
int hauteur;

public void init() {
setSize(800,400);
test = new Button("test");
add(test);
test.addActionListener(this);
}

public void actionPerformed(ActionEvent evt) {

if(evt.getSource()==test) {
setSize(1601,820);
setSize(1600,820);
Label dim=new Label(largeur+" "+hauteur);
add(dim);
}
repaint();

}

public void paint(Graphics g) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
DisplayMode dm = gd.getDisplayMode();
hauteur=dm.getHeight();
largeur=dm.getWidth();
}
}

Et en fait, ça me donne la résolution de mon écran !

Sinon, les super.getSize().height ou .width me donnent les dimensions fixées dans le source du fichier html.

Je ne vois pas comment faire.