سؤال

لقد قمت بتجميع تطبيق أساسي حيث يقوم المستخدم بتحديد ملف من محرك الأقراص الثابت ملف من خلال طلب نشر HTTP. لقد وجدت تطبيقًا أساسيًا مفتوح المصدر لتحميل الملفات التي قمت بنسخها وتعديلها لهذا الجزء الأخير.

المشكلة ، مع ذلك ، لا تعمل تمامًا. يبدو أنه يعمل بشكل جيد ، ولكن بعد ذلك ركضت إلى عقبات تتعلق بالأذونات. تقول الرسائل الواردة في وحدة التحكم Java أن Applet كان يتمتع بالوصول إلى أخطاء في الأذنين التاليين:

java.lang.RuntimePermission setFactory
java.io.FilePermission read

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

أيضًا ، الجزء الذي قمت بترميزه بنفسي ، حيث يقرأ الملف وينتقل السطر الأول إلى JavaScript يعمل بشكل جيد. هذا مؤشر واضح إلى حد كبير على أن Applet قادر على القراءة من نظام الملفات المحلي! لا تبدأ المشكلة حتى أحاول بالفعل بدء التحميل. هناك شيء واحد يجب ملاحظته هو أن عملية التحميل يبدو أنها تعمل في مؤشر ترابط جديد ، في حين أن بقيةها تعمل في الفئة الرئيسية دون إنشاء مؤشرات الترابط.

أنا مبتدئ إجمالي لجافا وأعرف القليل جدًا عن الخيوط في جافا ؛ هل أحتاج إلى تمرير الأذونات على هذا الموضوع الجديد بطريقة ما؟ أو شيء من هذا القبيل؟ شكرا مقدما.

هل كانت مفيدة؟

المحلول

ربما تحتاج إلى سؤال مدير الأمان (الرمز ، وليس المسؤول) للحصول على إذن للقيام بعملية مميزة. لأسباب مختلفة ، ليس من الجيد عمومًا أن يكون تطبيق Applet قادرًا على فتح ملف محلي ، لذا فهو يحرس بشدة.

المفتاح الأساسي هو الاتصال AccessController.doPrivileged() وهناك أ تعليمي صغير جيد على ذلك في جافا مزرعة الأسئلة الشائعة.

نصائح أخرى

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

عمل هذا الحلول بالنسبة لي (إضافة أوامر إلى قائمة انتظار التي يحلقها التطبيق):http://blog.carrythezero.com/؟p=5

تأكد من فهم المخاطر هنا: يمكن لأي شخص تعديل JavaScript على صفحة وتغيير ما يتم تغذيته في التطبيق. في حالتي ، أعرف أن الرمز لا يسير على خادم ويب أبدًا ، والفصل غير موقّع بحيث يفشل إلا في الموقع المحدد الممنوح من ملف السياسة الخاص بي.

ربما يكون ذلك لأن JavaScript غير موقعة. أقترح بشدة عدم توقيع التعليمات البرمجية ، خاصة إذا كنت لا تعرف ما تفعله. من 6U10 (وليس على MAC حتى الآن) يمكن للتطبيقات استخدام JNLP بما في ذلك FileOpenService ، لذلك لا يتعين عليك التوقيع.

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