Débutante JAVA : Erreur

Gaëlle -  
 soregh -
Bonjour à tous,

Je viens de faire un petit pgm "hello world" en java (C'est ma 1ere expérience en matière de prog).
Quand je lance le serveur j'ai l'erreur suivante :

java.security.AccessControlException: access denied
(java.net.SocketPermission 127.0.0.1:1099 connect,resolve)


J'ai trouvé sur le Net la solution, mais je n'arrive pas à comprendre ce qu'il faut faire (créer des fichiers? où ça? juste les modifier?..etc) Est ce quelqu'un pourrait me traduire de façon simple le etxte ci dessous pour savoir ce que je dois faire? merci d'avance...c'est un projet que je dois avoir terminé mercredi :(

Lorsque l'on essaie d'utiliser un SecurityManager, on obtient le message d'erreur suivant :
java.security.AccessControlException: access denied
(java.net.SocketPermission 127.0.0.1:1099 connect,resolve)

Modification par programme
System.setSecurityManager (new RMISecurityManager() {
public void checkConnect (String host, int port) {}
public void checkConnect (String host, int port, Object context) {}
});

Le fichier .java.policy
Les permissions du SecurityManager sont spécifiées dans l'ordre :

dans le fichier java.policy de ${java.home}/lib/security/java.policy

puis dans

${user.home}/.java.policy (attention au point !)

Les instructions du fichier policy
Le serveur doit pouvoir accepter des connexions d'un hôte particulier :

permission java.net.SocketPermission "sace.essi;fr", "accept";

ou de tous les hôtes et pouvoir faire resolve également :

permission java.net.SocketPermission "*", "accept, resolve";

Pour définir cela, lancer la commande (sous jdk/bin) (voir aussi "A quick look at policytool"):

policytool

et éditer le fichier .java.policy (sous Linux sous ~, sur PC sur c:\winnt\profiles\votreNomuser)


Merci encore pour votre aide

Gaëlle

45 réponses

  • 1
  • 2
  • 3
Résumé de la discussion

Une erreur java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve) survient lors du démarrage d’un serveur RMI en Java. Les solutions tournent autour du fichier java.policy (dans ${java.home}/lib/security/java.policy puis dans ${user.home}/.java.policy) pour accorder des permissions SocketPermission et l’usage éventuel de policytool pour modifier ce fichier. D'autres éléments clés: vérifier que le port dans le code et dans le fichier java.policy correspond au port attendu (1099 par défaut) et redémarrer rmiregistry après chaque modification. En pratique, la mise en place peut nécessiter policytool pour générer ou modifier un fichier .java.policy et s’assurer que les composants s’exécutent sur la même machine ou que les connexions entrantes soient autorisées.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. silfaxu Messages postés 102 Statut Contributeur 11
     
    Salut,

    Il me semble que le port que tu utilises n'est pas le même dans le fichier HelloImpl (port 1000) et le fichier java.policy (port 1024 et suivant) ...
    De plus, le port normalement utilisé par RMI est le 1099 ...
    As-tu essayé le port par defaut (1099) à la fois dans le fichier java.policy et la classe HelloImpl ?
    De plus, tu écris que le fichier qui gère les permissions s'appelle java.policy et dans la ligne de commande qui démarre le serveur, tu as écris 'policy' et non java.policy ...

    Et n'oublie pas d'arrêter et de redemarrer le rmiregistry à chaque fois que tu modifies et donc recompile tes classes (de même si tu modifies le fichier java.policy)

    J'espere que ça t'aideras ...

    sfx
    6
  2. Gaëlle
     
    donc j'ai essayé en lancant rmiregistry sur le port 1000

    C:\TEST>java -Djava.security.policy=policy rmidemo.HelloImpl
    HelloServer enregistrÚ dans le registry


    c'est bien ce que j'avais mis dans HelloImpl

    public static void main(String args[])
    {
    //
    //cré et installe un security manager
    //
    if (System.getSecurityManager() == null) {
    System.setSecurityManager(new SecurityManagerPermissif());
    }
    try{
    HelloImpl obj = new HelloImpl("HelloServer");
    Naming.rebind("//192.168.0.5:1000/HelloServer", obj);
    System.out.println("HelloServer enregistré dans le registry");
    }
    catch (Exception e){
    System.out.println("HelloImpl err: " + e.getMessage());
    e.printStackTrace();
    }
    }
    }
    alors après je lance index.html parce que c'est fait avec un applet

    //HelloApplet.java
    //
    package rmidemo;
    import java.awt.Graphics;
    import java.rmi.Naming;
    public class HelloApplet extends java.applet.Applet {
    String message = "";
    public void init() {
    try {
    Hello obj = (Hello)Naming.lookup("//" +
    getCodeBase().getHost() + "/HelloServer");
    message = obj.sayHello();
    } catch (Exception e) {
    System.out.println("HelloApplet exception: " +
    e.getMessage());
    e.printStackTrace();
    }
    }
    public void paint (Graphics g) {
    g.drawString(message, 25, 50);
    }
    }


    Il me dit que l'applet est démarré mais ya rien qui s'affiche et là ya une console java qui lance et dedans j'ai un msg d'erreur :

    HelloApplet exception: Connection refused to host: 192.168.0.5; nested exception is:
    java.net.ConnectException: Connection refused: connect

    java.rmi.ConnectException: Connection refused to host: 192.168.0.5; nested exception is:
    java.net.ConnectException: Connection refused: connect

    java.net.ConnectException: Connection refused: connect

    at java.net.PlainSocketImpl.socketConnect(Native Method)

    at java.net.PlainSocketImpl.doConnect(Unknown Source)

    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)

    at java.net.PlainSocketImpl.connect(Unknown Source)

    at java.net.Socket.<init>(Unknown Source)

    at java.net.Socket.<init>(Unknown Source)

    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)

    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)

    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)

    at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)

    at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)

    at sun.rmi.server.UnicastRef.newCall(Unknown Source)

    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)

    at java.rmi.Naming.lookup(Unknown Source)

    at rmidemo.HelloApplet.init(HelloApplet.java:10)

    at sun.applet.AppletPanel.run(Unknown Source)

    at java.lang.Thread.run(Unknown Source)


    Tu me dis "De plus, tu écris que le fichier qui gère les permissions s'appelle java.policy et dans la ligne de commande qui démarre le serveur, tu as écris 'policy' et non java.policy ... "...euh..faudrait que j'écive quoi alors?????

    Gaëlle
    3
  3. vlt
     
    Salut,

    Tu doit aller dans MSDOS
    vas dans demrrer/excuter/et tape command puis click ok
    pour aller à la racine tape cd.. quand tu est dans la racine
    soit C:\tape edit autoexec.bat editeur apparait en bleu
    et faut rajouter un ligne de code qui est :
    path=C:\JDK ou SDK autre\bin puis enregistrer le fichier
    et redamarrer l'ordinateur.

    toto.java compiler avec javac.toto.java
    pour le fichier class.

    Joyeux noël et bonne année vlt
    1
  4. silfaxu Messages postés 102 Statut Contributeur 11
     
    Salut,

    Est-ce que le serveur et le client sont une seule et même machine ?
    Si non, le serveur est-il derrière un firewall ?

    sfx
    1
    1. IDSP23
       
      Bonjour..
      Je croie que vous pouvais m'aider ..
      Comment compiler un programme ecris en JAVA
      Répondez moi SVP..
      0
    2. soregh
       
      javac className.java
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Gaelle
     
    Salut et merci à tous,

    vlt, j'ai déjà ajouter les cmd java dans la variable d'environnement PATH. Pour "toto.java compiler avec javac.toto.java
    pour le fichier class. " je ne vois pas le rapport.

    sfx, le client et le serveur sont sur la même machine, mais le but de ce programme car c'est du java avec RMI c'est que n'importe quel client puisse y accéder .

    idsp23, pour compiler un programme java, en ligne de commande tu tapes javac repertoireparent.nomduprogramme

    Sinon est ce que quell'un a réussi à décoder la soluce de mon probleme que j'ai trouvé sur le net?

    Gaëlle
    1
    1. IDSP23
       
      Merci Daëlle pour ta réponse, j'ai trouvé dans jcreator l'option de compilation, mais voilà j'ai un message d'erreur qui me demande de créer d'abord le "JDK Profile" ..?
      C quoi encore cela ?
      Merci d'avance..
      Idsp23
      0
  7. rameur Messages postés 135 Statut Membre 21
     
    configurer les variables d env sous windows :
    tu ouvres c:\autoexec.bat
    tu ajoutes les lignes
    set path = %path%;= $jdk_home$\bin
    set classpath = $jdk_home$\lib\tools.jar;. ($jdk_home$=
    rep ou java est installe et . le rep courant)
    tu redemarre ensuite et maintenant tu peux compiler ou excuter tes classes a partir de n importe quel rep

    pour compiler ton prg a partir de msdos tu te places dans le rep qui contient tes classes par ex toto.java et tu tapes
    javac toto.java
    pour executer
    java toto (pas d extension !)
    tu peux utiliser un editeur de texte comme textpad (fait 1 recherche sur le web)qui est gratuit et vachement pratique pour deboguer et executer tes prg (tu regardes dans le menu tools\run tu changes le rep courant et les champs adequats)
    la ligne de commande est fastidieuse surtout quand tu fais trop d erreur
    1
  8. Gaëlle
     
    bonsoir tout le monde et merci pour toutes vos réponses,

    mais jevais devoir recentrer le sujet...je n'ai pas de probleme de varaible d'environnement et ttou et tout.

    je viens de créer mon 1er prog en java - rmi, point d'erreur à la compile ..mais une au lancement du serveur (tous les fichiers se trouvent sur la meme machine) :
    java.security.AccessControlException: access denied
    (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)

    j'ai donc trouvé sur le net ce qui pourrait etre la solution mais du haut de mes 5 jours de java (c'est pour un projet pour mon école) je ne trouve pas ce que j'ai trouvé très claire..je demandais donc si quelqu'un saurait mexpliquer ce qui est dit dans le 1er msg de ce sujet en gras de façon claire. Si quelqu'un connait RMI (remote method invocation) merci de me faire un grand signe!! merci à tous et bisous

    Gaëlle
    1
    1. silfaxu Messages postés 102 Statut Contributeur 11
       
      Salut,

      Ton problème vient du security manager que tu as mis en place ...
      Est-ce que tu lui précises quel fichier policy utiliser ? Pour être plus précis, est-ce que tu lui donne, dans ta ligne de commande, le fichier policy à utiliser ?
      (tu as un mot clé à utiliser dans ta ligne de commande)

      @+

      sfx
      0
    2. silfaxu Messages postés 102 Statut Contributeur 11
       
      Salut,

      Il faut rajouter, dans ta ligne de commande qui démarre ton serveur, le texte suivant :
      -Djava.security.policy=<chemin relatif ou absolu de ton fichier java.policy>

      @+

      sfx
      0
  9. Gaëlle
     
    Salut,

    merci à tous pour vos réponses, sfx je vais essayer ce que tu m'as dit ...idsp23 je ne connais pas la solution à ton problème...

    Merci également à la personne (désolée j'ai oublié le pseudo) qui m'as mit un lien vers un problème similaire.

    Je me penche dessus et je vous tiens au courant.

    A bientot
    Gaëlle
    0
  10. Gaëlle
     
    Re les jeunes,
    alors voilà j'ai effectué quelques modifications en fonction de ce que j'ai trouvé sur Internet mais j'ai toujours un problème....

    j'ai modifié le java.policy avec la ligne

    permission java.net.SocketPermission "192.168.0.5:1024-", "listen,connect,resolve";

    J'ai créé dans mon package le fichier SecurityManagerPermissif.java

    package rmidemo

    import java.rmi.*;
    import java.security.*;

    public class SecurityManagerPermissif extends RMISecurityManager {

    public void checkPermission(Permission p) {
    //ne fait rien
    }
    }

    Je l'ai compilé sans difficulté.

    Et j'ai modifié le main de mon fichier HelloImpl.java

    public static void main(String args[])
    {
    if (System.getSecurityManager()== null) {
    System.setSecurityManager(new SecurityManagerPermissif());
    }
    try{
    HelloImpl obj = new HelloImpl("HelloServer");
    Naming.rebind("//192.168.0.5:1000/HelloServer", obj);
    System.out.println("HelloServer enregistré dans le registry");
    }
    catch (Exception e){
    System.out.println("HelloImpl err: " + e.getMessage());
    e.printStackTrace();
    }
    }
    }


    Quand je lance la commande:
    java -Djava.security.policy=policy rmidemo.SecurityManagerPermissif
    j'ai l'erreur suivante :

    Exception in thread "main" java.lang.NoSuchMethodError: main

    Je ne sais vraiment plus quoi faire...
    Un coup de main serait vraiment le bienvenu

    Gaëlle
    0
  11. silfaxu Messages postés 102 Statut Contributeur 11
     
    Salut Gaelle,

    La méthode main n'est pas dans ta classe SecurityManagerPermissif mais dans la classe HelloImpl ....

    Tu dois donc executer le fichier rmidemo.HelloImpl et non SecurityManagerPermissif (qui est appelé par HelloImpl)

    sfx
    0
  12. Gaëlle
     
    Re sfx, merci encore pour toutes réponses, ça me panique un peu moins , je me sens moins seule ;)

    Alors j'ai donc éxecuter ceci

    C:\TEST>java -Djava.security.policy=policy rmidemo.HelloImpl

    et voici l'erreur (nouvelle )

    Exception in thread "main" java.lang.Error: ProblÞme de compilation non rÚsolu :

    Erreur de syntaxe sur le mot clÚ "import"; ";" attendu

    at rmidemo.SecurityManagerPermissif.<init>(SecurityManagerPermissif.java
    :3)
    at rmidemo.HelloImpl.main(HelloImpl.java:21)


    pour la premier erreur à propos de import c'est bien rédigé je comprends pas, je te mets ci dessous le SecurityManagerPermissif

    package rmidemo

    import java.rmi.*;
    import java.security.*;

    public class SecurityManagerPermissif extends RMISecurityManager {

    public void checkPermission(Permission p) {
    //ne fait rien
    }
    }


    Poiur l'autre erreur dans le main, il est dans mon msg précédent mais je vois pas non plus pourquoi ça coinceet ce qu'il faut faire.

    Gaëlle
    0
    1. silfaxu Messages postés 102 Statut Contributeur 11
       
      Salut,

      Il faut un ';' à la fin de la ligne
      package rmidemo

      @+

      sfx
      0
  13. Gaëlle
     
    Merci sfx ,

    bon après avoir corrigé cette erreur, voilà on msg qui revient :

    C:\TEST>java -Djava.security.policy=policy rmidemo.HelloImpl
    HelloImpl err: Connection refused to host: 192.168.0.5; nested exception is:
    java.net.ConnectException: Connection refused: connect
    java.rmi.ConnectException: Connection refused to host: 192.168.0.5; nested excep
    tion is:
    java.net.ConnectException: Connection refused: connect
    java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(Unknown Source)
    at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown S
    ource)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S
    ource)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
    at sun.rmi.server.UnicastRef.newCall(Unknown Source)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    at java.rmi.Naming.rebind(Unknown Source)
    at rmidemo.HelloImpl.main(HelloImpl.java:25)


    retour à la case départ on dirait! :(

    Gaëlle
    0
  14. Gaelle
     
    en tapant
    java -Djava.security.policy=java.policy rmidemo.HelloImpl

    la meme erreur qu'au msg ci-dessus... ;(

    Merci pour ton attention sfx...je commence à désespérer là!

    Gaëlle
    0
  15. silfaxu Messages postés 102 Statut Contributeur 11
     
    Salut Gaelle,

    Essaie de changer le numéro de port ... essaie avec 1099 ( les ports en dessous de 1024 posent un problème quelque fois ...)

    sfx
    0
  16. silfaxu Messages postés 102 Statut Contributeur 11
     
    Resalut,

    Tu peux aussi modifier ton fichier java.policy en mettant comme unique permission celle-ci :

    grant {
    permission java.security.AllPermission;
    };

    Ce qui donne tous les droits pour n'importe quel port ... c'est juste un test ... A ne surtout pas utiliser dans le cadre d'une appli réelle ... ;-))

    @+

    sfx
    0
  17. Gaëlle
     
    Salut,

    ça fonctionne en faisaint tout passer par le port 1099, merci :)

    Mais maintenant j'ai un autre problème, moi j'ai fait ça avec un applet mais en fait il faut un client applicatif tout court parce que le but c'est qu'à partir d'un autre poste et bien ça m'affiche Hello World...Je me mets sur le client de suite et je vous teins au courant, car je pense rencontrer (encore!!) des difficultées.

    Gaëlle
    0
  18. Gaëlle
     
    Resalut,

    voilà j'ai fait un client, enfin on m'avait fourni le code mais j'ai des petites erreurs dedans :

    //HelloMain.java
    //
    package rmidemo;

    import java.rmi.Naming;

    public class HelloMain {
    public static void main(String[] args) {
    try {
    Hello obj = (Hello)Naming.lookup("//"+args[0]+"/HelloServer");
    message = obj.sayHello();
    System.out.println("Le message est: "+message);
    } catch (Exception e) {
    System.out.println("HelloMain exception: "+e.getMessage());
    e.printStackTrace();
    }
    }

    }


    Les erreurs sont à aux lignes suivantes:

    message = obj.sayHello();
    System.out.println("Le message est: "+message);


    on me dit que message ne peut pas être résolu :(

    Gaëlle
    0
  19. Gaëlle
     
    Resalut,

    voilà j'ai fait un client, enfin on m'avait fourni le code mais j'ai des petites erreurs dedans :

    //HelloMain.java
    //
    package rmidemo;

    import java.rmi.Naming;

    public class HelloMain {
    public static void main(String[] args) {
    try {
    Hello obj = (Hello)Naming.lookup("//"+args[0]+"/HelloServer");
    message = obj.sayHello();
    System.out.println("Le message est: "+message);
    } catch (Exception e) {
    System.out.println("HelloMain exception: "+e.getMessage());
    e.printStackTrace();
    }
    }

    }


    Les erreurs sont à aux lignes suivantes:

    message = obj.sayHello();
    System.out.println("Le message est: "+message);


    on me dit que message ne peut pas être résolu :(

    Gaëlle
    0
    1. silfaxu Messages postés 102 Statut Contributeur 11
       
      Salut,

      Une bonne chose de faite ... Les ports en dessous de 1024 sont (en général) réservés pour d'autres protocoles et uniquement accessibles par des processus systèmes (sous Unix ... sous Windows, je suppose que c'est plus ou moins la même chose)
      Peux-tu donner le message d'erreur (complet) que tu as maintenant ?

      sfx
      0
    2. barabbas
       
      ça c'est parceque la vble message n'est pas déclarée d'avance
      0
  20. Gaelle
     
    RE tout le monde et surtout toua sfx ;)

    pour windows aussi les ports jusqu'à 1024 sont en général réservés mais je n'y avais pas pensé ;)

    En fait, c'était une erreur , j'ai trouvé, il fgallait mettre
    String message = obj.sayHello(); y'avait pas le String.

    Par contre maintenant je sais pas comment me connecter avec le client...j'ai lancé le registry, le serveur tout passe..

    mais alors et pour le client?? dans un premier temps à partir de mon poste où il y a le serveur qui tourne, et puis bien sur à partir d'un autre pc connecté sur le même Lan? Tu sais comment je dois faire?

    Gaëlle
    0
  21. Gaëlle
     
    re,

    en lançant le client comme ça ( à partir du pc où il y a tout)

    C:\TEST>java rmidemo.HelloMain

    voilà l'erreur :

    HelloMain exception: null
    java.lang.ArrayIndexOutOfBoundsException
    at rmidemo.HelloMain.main(HelloMain.java:10)


    Gaëlle
    0
    1. silfaxu Messages postés 102 Statut Contributeur 11
       
      Salut Gaelle,

      C'est normal ... tu dois donner en paramètre le serveur à contacter ... (c'est args[0] de ton client) ....

      java demormi.HelloMain localhost
      ou
      java demormi.HelloMain 127.0.0.1

      sfx
      0
  • 1
  • 2
  • 3