2016-05-27 3 views
0

Мне нужны предложения относительно java.security.AccessControlException, я получаю при выполнении следующего кода. (Я консультировался подобные вопросы здесь, но не успех, чтобы заставить его работать)Как решить java.security.AccessControlException

Вот мой код сервера:

public class GetPageInfos extends UnicastRemoteObject implements RemoteGetInfo{ 

    private static final String url="http://www.lemonde.fr/"; 
public class GetPageInfos extends UnicastRemoteObject implements RemoteGetInfo{ 
    private static final String url="http://www.lemonde.fr/"; 

    public GetPageInfos() throws RemoteException{   
    } 

    public String getSiteInfos() throws RemoteException { 
     Document doc; 
      try {     
       doc = Jsoup.connect(url).get(); 
       String title = doc.title(); 
       return "title is "+title;          
      } catch (IOException e) { 
       System.out.println("Faild! "+e.getMessage()); 
       return "not found"; 
      } 

    } 

    public static void main(String[] args){ 
     try { 

      GetPageInfos infos= new GetPageInfos(); 
      //System.setProperty("java.rmi.server.hostname","5lq04x1.gemalto.com"); 
      Naming.rebind("RemoteGetInfo", infos); 
      /*GetPageInfos obj=new GetPageInfos(); 
      RemoteGetInfo stub = (RemoteGetInfo) UnicastRemoteObject.exportObject(obj, 0); 
      Registry registry = LocateRegistry.getRegistry(); 
      registry.bind("RemoteGetInfo", stub); 
      */ 
      System.out.println("server ready"); 

     } catch (RemoteException e) { 
       System.out.println("GetPageInfos "+e.getMessage()); 
     } 
     catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

И вот мой код клиента:

//RMI Client 
public class PrintSiteInfos { 

    public static void main(String arg[]) 
    { 

     System.setSecurityManager(new RMISecurityManager()); 

      try 
       { 

        /*String host=null; 
        Registry registry = LocateRegistry.getRegistry(host); 
        RemoteGetInfo stub = (RemoteGetInfo) registry.lookup("RemoteGetInfo"); 
        String response = stub.getSiteInfos(); 
        System.out.println(response); */ 
       RemoteGetInfo obj = (RemoteGetInfo) Naming.lookup("RemoteGetInfo");   
       System.out.println(obj.getSiteInfos()); 
       } 
       catch (Exception e) 
       { 
        System.out.println("PrintSiteInfos exception: " + e.getMessage()); 
        e.printStackTrace(); 
       } 
    } 
} 

Я получил

exception: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve") 

я обнаружил, что я должен передать файл политики, который я имею, как:

grant { 
    permission java.security.AllPermission;}; 

Но как? Другие предложения?

+1

Возможный дубликат [Как решить java.security.AccessControlException?] (Http://stackoverflow.com/questions/14650010/how-to-solve-java-security-accesscontrolexception) – Jaimesh

ответ

2

Вы можете разрешить только разрешение сокета не всех разрешений (что может представлять угрозу безопасности). Так что-то вроде:

grant { 
    permission java.net.SocketPermission "127.0.0.1:1099", "connect, resolve"; 
}; 

Два способа сделать это:

1) в качестве аргумента в командной строке

java -Djava.security.policy=mypolicyfile PrintSiteInfo 

2) в среде JRE:

добавить разрешение в файле JRE_HOME/lib/security/java.policy

1

Избавьтесь от управления безопасностью э. Это вам не нужно, если вы не используете функцию кодовой базы RMI.