سؤال

أحاول إنشاء تطبيق appret java Java الذي سيتم تشغيله في متصفح، قم بتنزيل صورة من عنوان URL، وعرضه للمستخدم. تنفيذي هو:

try {
     String imageURL = "http://www.google.com/intl/en_ALL/images/logo.gif";
     URL url = new URL(imageURL);
     img = ImageIO.read(url);
   } catch (IOException e) {
     System.out.println(e);
   }  

لكنه يعطيني استثناء أمني:

java.security.AccessControlException: access denied (java.net.SocketPermission www.google.com:80 connect,resolve)

المحلول:

لقد نفذت اقتراح سكين عمل يسوع، ويعمل في متصفح الويب (ولكن لا تستخدم Viewer Appret).

فقط مع برنامج الصليب الأحمر ما زلت أواجه:

java.security.AccessControlException: access denied (java.net.SocketPermission www.google.com:80 connect,resolve)

عند تحميل صفحة الويب في متصفح، يوجد مربع حوار ثقة / رفض، إذا قمت بالنقر فوق Trust، ثم تظهر الصورة.

هذه هي الخطوات التي آخذها:

ant makejar
jarsigner -keystore keystore-name -storepass password -keypass password web/LoadImageApp.jar alias-name
jarsigner -verify -verbose web/LoadImageApp.jar 
appletviewer web/index.html  ## as mentioned above, this gives a security exception. instead, load the webpage in a browser.

الإخراج من Jarsigner -Verify هو:

Warning: The signer certificate will expire within six months.

         332 Thu Jan 07 20:03:38 EST 2010 META-INF/MANIFEST.MF
         391 Thu Jan 07 20:03:38 EST 2010 META-INF/ALIAS-NA.SF
        1108 Thu Jan 07 20:03:38 EST 2010 META-INF/ALIAS-NA.DSA
sm       837 Thu Jan 07 20:03:38 EST 2010 LoadImageApp$1.class
sm       925 Thu Jan 07 20:03:38 EST 2010 LoadImageApp.class
sm        54 Wed Jan 06 01:28:02 EST 2010 client.policy

  s = signature was verified 
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
  i = at least one certificate was found in identity scope

jar verified.

فيما يلي الكود المصدري الكامل Java (للتأكيد على المفهوم، أزلت كل ما هو التحقق من الاستثناء / الفحص الفارق الإضافي):

import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.swing.*;
import java.net.*;
import java.security.*;

public class LoadImageApp extends JApplet
{
  private BufferedImage img;
  private final String imageURL = "http://www.google.com/intl/en_ALL/images/logo.gif";

  public void init()
  {
    loadImage();
  }

  public void paint(Graphics g)
  {
    if (null != img) { g.drawImage(img, 0, 0, null); }
  }

  public void loadImage()
  {
    AccessController.doPrivileged(new PrivilegedAction()
    {
      public Object run()
      {
        try
        {
          URL url = new URL(imageURL);
          if (null == url)
          {
            throw new MalformedURLException();
          }
          img = ImageIO.read(url);
        }
        catch (Exception e) { e.printStackTrace(); }
        return null;
      }
    });
  }

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

المحلول

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

تحتاج إلى القيام بما يلي من أجل الاتصال بشكل صحيح بعنوان URL البعيد.

قم بإنشاء شهادة موقعة ذاتيا على الأقل، من الناحية المثالية لديك شهادة تم التحقق منها مرتبطا عبر VeriSign أو بعض المرجع المصدق آخر (CA) من اختيارك. تعليمات الشهادة

قم بتوقيع جرة الخاص بك باستخدام Jarsigner. تعليمات التوقيع

الآن يمكنك التفاف الرمز الخاص بك في كتلة مميزة على النحو التالي

try 
{
    final String imageURL = "http://www.google.com/intl/en_ALL/images/logo.gif";
    URL url = (URL) AccessController.doPrivileged(new PrivilegedAction() 
    {

        public Object run() 
        {
            try
            {
                return new URL(imageURL);
            }
            catch (MalformedURLException e)
            {
                e.printStackTrace();
                return null;
            }

        }  
    });  

    if(url == null)
    {
         // Something is wrong notify the user
    }
    else
    {
         // We know the url is good so continue on
          img = ImageIO.read(url);
    }

} 
catch (IOException e) 
{
    System.out.println(e);
}  

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

import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.swing.*;

import java.io.IOException;
import java.net.*;
import java.security.AccessController;
import java.security.PrivilegedAction;

public class LoadImageApp extends Applet
{
  private BufferedImage img;
  private final String imageURL = "http://www.google.com/intl/en_ALL/images/logo.gif";

  public void init()
  {
    loadImage();
  }

  public void paint(Graphics g)
  {
    if (null != img) { g.drawImage(img, 0, 0, null); }
  }

  public void loadImage()
  {
    URL url = (URL) AccessController.doPrivileged(new PrivilegedAction()
    {
      public Object run()
      {
        try
        {
            return new URL(imageURL);
        }
        catch (Exception e) { e.printStackTrace(); }
        return null;
      }
    });

    try {
        img = ImageIO.read(url);
    } catch (IOException e) {
    e.printStackTrace();
    }

  }
}

نصائح أخرى

يبدو أنك تقوم بتشغيل برنامج صغير بدلا من تطبيق عادي. لا يسمح الصبر باسترداد أي موارد خارج المجال تم تحميلها من. الفكرة هي منع التطبيقات "السيئة" من استدعاء شيء مثل

string targeturl = "http://www.foo.bar/spoof؟source" + system.getproperty ("...)؛

أو نقل أنواع البيانات الأخرى إلى وجهة غير معروفة.

إذا كنت بحاجة حقا لاسترداد البيانات الخارجية، فعليك إشارة التطبيق الصغير الخاص بك.

  1. قم بإنشاء مكالمة "سياسة" في نفس المجلد من جرة الخاص بك
  2. نسخ / لصق النص التالي فيه:

    منح {إذن java.security.allpermission؛}؛

  3. بدء التطبيق مثل هذا:

    جافا - yourjar.jar. -djava.security.policy = السياسة

يبدو أنك لا تحاول إنشاء jar الملف الذي سيتم تشغيله من سطر الأوامر ولكن التطبيق الصغير الذي سيتم تنفيذه في المتصفح. إذا كان هذا صحيحا، فأنت بعيد جدا لأن التطبيق يسمح فقط بالوصول إلى الخادم الذي تم تحميله من. إذا كنت ترغب حقا في الوصول إلى خوادم أخرى من التطبيق الصغير، فعليك توقيع التطبيق الصغير الخاص بك؛ يمكن Google مساعدتك في العثور على مزيد من المعلومات.

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