Frage

Ich versuche, ein Java-Applet jar zu erstellen, die in einem Browser ausgeführt wird, laden Sie ein Bild von einer URL, und zeigt sie an den Benutzer. Meine Implementierung ist:

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);
   }  

Aber es gibt mir eine Sicherheitsausnahme:

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

Lösung:

Ich habe implementiert Knife-Aktion-Jesus Vorschlag, und es funktioniert in einem Web-Browser (aber den Applet-Viewer nicht verwenden).

Nur mit dem Applet-Viewer ich noch begegnen:

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

Wenn Sie die Webseite in einem Browser geladen wird, gibt es ein Vertrauen / Deny-Dialogfeld, wenn ich Vertrauen klicken, dann wird das Bild angezeigt wird.

Dies sind die Schritte, die ich nehme:

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.

Die Ausgabe von jarsigner -verify ist:

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.

Hier finden Sie die komplette Java-Quellcode (das Konzept zu betonen, ich alle, dass zusätzliche Ausnahmebehandlung / null Prüfung entfernt):

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;
      }
    });
  }

}
War es hilfreich?

Lösung

Ihr laufen in die Ausnahme, da standardmäßig Applets geladen werden in die Sandbox-Sicherheit, Sandbox können Sie nur url Verbindungen zur Domäne dient, das Applet machen. Das heißt, Sie können nicht eine URL Verbindung Google erstellen, wenn Sie von Google gehostet Applet ist.

Sie müssen die folgenden, um zu tun, um richtig zu einer Remote-URL zu verbinden.

Erstellen Sie ein selbst signiertes Zertifikat zumindest, im Idealfall haben Sie eine überprüfte Zertifikat Verknüpfung zurück durch verisign oder eine andere Zertifizierungsstelle (CA) Ihre Wahl. Zertifikat Anweisungen

Melden Sie Ihr Glas jarsigner verwenden. Signing Anleitung

Jetzt können Sie Ihren Code in einem privilegierten Block wickeln wie folgt

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);
}  

Ich importierte Applet-Code, ich um einen Teil davon eingeschaltet, über das img Instanziierung Ziehen des privilegierten Blockes & mit dem Block eine URL zurück. Dies funktioniert, wenn ich es in einen Web-Browser laden.

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();
    }

  }
}

Andere Tipps

Es scheint, dass Sie ein Applet statt einer normalen Anwendung laufen lassen. Ein Applet ist keine Ressourcen außerhalb der Domäne abzurufen erlaubt es aus geladen wurde. Die Idee ist, „schlecht“ Anwendungen von Aufruf etwas wie

zu verhindern
String targetURL = "http://www.foo.bar/spoof?source" + System.getProperty("...);

oder andere Arten von Daten zu einem unbekannten Ziel Übertragung.

Wenn Sie wirklich externe Daten abrufen, müssen Sie müssen Zeichen Ihr Applet.

  1. Erstellen Sie eine Datei call "policy.all" im gleichen Ordner Ihrer jar
  2. Kopieren / fügen Sie den folgenden Text in ihm:

      

    grant {permission java.security.AllPermission;};

  3. Anwendung starten wie folgt aus:

      

    java -jar yourjar.jar -Djava.security.policy = policy.all

Klingt wie Sie keine jar-Datei zu erstellen versuchen, die von der Kommandozeile ausgeführt werden, aber ein Applet, das im Browser ausgeführt wird. Wenn das wahr ist, bist du ziemlich viel Glück, weil Applets nur erlaubt sind, auf den Server zuzugreifen sie geladen wurden. Wenn Sie wirklich andere Server von einem Applet zugreifen möchten, müssen Sie Ihr Applet unterzeichnen; Google kann Ihnen helfen, mehr Informationen zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top