سؤال

يا أنا أحصل على AccessControlException: access denied عند محاولة بدء تشغيل تطبيق RMI، لا أكتب، لا أستطيع العمل لماذا أحصل على هذا الاستثناء إذا قمت بفتحه على المنفذ الافتراضي 1099، أو على منفذ ديناميكي آخر، يمنح ملف سياسي حاليا كل شيء (سيغير متى انتهى التطبيق).

أنا عالق فيما يتعلق بالمكان الخطأ، فسيكون أي مساعدة من الاستخدامات الكبيرة

رمز بلدي

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
     if (System.getSecurityManager() == null)
     {
        System.setSecurityManager ( new RMISecurityManager() );
     }

     CreditCardServer ccs = new CreditCardServer();

     int port = 1099;

     try {
        port = Integer.valueOf(args[0]);
        }
     catch (Exception e)
        {
        System.out.println("Invlaid Port");
        }

     if (((port <= 65535) && (port >= 49152)) || port ==1099)
     {
     System.out.println("Valid Port");
     }
     else
     {
         port = 1099;
        System.out.println("Port not in Dynamic Range 49152<-->65535");
     }

     System.out.println(port);

     LocateRegistry.createRegistry(port);

     LocateRegistry.getRegistry().bind("CreditCardServer", ccs);

     while (true)
     {
        //hum?
     }
}

}

تتبع المكدس

vega3 [ia32.linux] 23% java -Djava.security.policy=wideopen.policy -jar "BookStore-CreditCardServer.jar 65000"

منفذ صالح

65000

Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342)
        at java.security.AccessController.checkPermission(AccessController.java:553)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
        at java.lang.SecurityManager.checkConnect(SecurityManager.java:1051)
        at java.net.Socket.connect(Socket.java:536)
        at java.net.Socket.connect(Socket.java:492)
        at java.net.Socket.<init>(Socket.java:389)
        at java.net.Socket.<init>(Socket.java:203)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
        at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)
        at sun.rmi.registry.RegistryImpl_Stub.bind(Unknown Source)
        at bookstorecreditcardserver.Main.main(Main.java:56)

ملف سياسي الخاص بي

grant {
// Allow everything for now
permission java.security.AllPermission;
};
هل كانت مفيدة؟

المحلول 2

في الأساس، أنا غبي، افترضت أن جافا لم يكن يشكو أنه كان يجد ملف Aok. Policys Aok، اتضح أنه لا يتحرك نسخة جديدة من ملف. policys ملف في دليل العمل يحل الكل :-D

نصائح أخرى

لقد علقت في هذا اليوم (بعد معرفة ذلك، اضطررت إلى بدء تشغيل Rmiregistry من Commandline)، في محاولة لجعل هذا العمل محليا مع الكسوف، وأخيرا حلها. عدد قليل من المؤشرات لإنقاذ الآخرين هذا المصير القاسي:

1 - تعيين ملف السياسة بشكل صحيح، إما مع علامة Commandline:

java -Djava.security.policy=/home/.../<filename>.policy ...

أو عن طريق وضع هذا مباشرة في التعليمات البرمجية الخاصة بك:

System.setProperty("java.security.policy","file:///home/.../<filename>.policy");

يمكنك أيضا وضعه في نفس المجلد مثل جذر مشروعك)، لتقليل URI إلى

file:./<filename>.policy

(استخدم أحد الأقارب بدلا من URI المطلق - أنا فعلا لم أفهم هذا حتى اليوم).

2 - تأكد من صحة تنسيق ملف السياسة، على سبيل المثال:

grant codeBase "file:<path>/bin/-" {
    permission java.security.AllPermission;
};

يجب أن يشير هذا إلى المجلد الذي توجد فيه ثنائي! شرح شامل لتنسيق ملف السياسة هو هنا.

هذا عن ذلك، أود أيضا أن أوصي هذا البرنامج التعليمي, لقد وجدت أنه من المفيد للغاية الحصول على المسار الصحيح.

لقد وجدت معظم الإجابات على هذا الموضوع غامض وغير مفيد، وقضى عدة ساعات تصحيح هذا. أكثر من المرجح، الخطأ الخاص بك هو أن ملف السياسة يتم تنسيقه بشكل غير صحيح أو عدم إعداده بشكل صحيح كوسيطة سطر الأوامر.

إذا كنت تحصل على java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:1099" "connect,resolve")

  1. قم بإنشاء ملف سياسة أمان مع جميع الأذونات، فقط لاختباره

grant codeBase "file:/-" { permission java.security.AllPermission; };

  1. استخدم ملف الأمان هذا لكل من العميل والخادم، فقط لإجراء تشغيله.

  2. تأكد من عدم وجود أي خطأ مطبعي. قضيت ساعات في محاولة لمعرفة سبب عدم العمل، وكانت مكتوبة -djava.rmi.security.policy بدلا من -djava.security.policy =...

بالنسبة لأولئك منا يرغبون فقط في الحصول على البرنامج التعليمي RMI من Oracle Updeand، ستكون سياسة الأمان هذه أكثر من كافية لهذا المثال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top