Question

Je suis en train de créer un Applet jar java qui sera exécuté dans un navigateur, téléchargez une image à partir d'une URL, et afficher à l'utilisateur. Ma mise en œuvre est:

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

Mais il me donne une exception de sécurité:

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

Solution:

Je l'ai mis en œuvre la suggestion de couteau-action-Jésus, et il fonctionne dans un navigateur Web (mais pas en utilisant l'applet viewer).

uniquement avec le spectateur applet Je rencontre encore:

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

Lors du chargement de la page Web dans un navigateur, il y a une boîte de dialogue Confiance / Deny, si je clique confiance, l'image apparaît.

Ce sont les étapes que je prends:

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.

La sortie de jarsigner -verify est:

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.

Voici le code source complet java (pour mettre l'accent sur le concept, je l'ai enlevé tout ce que la manipulation / vérification nulle exception supplémentaire):

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

}
Était-ce utile?

La solution

Votre cours d'exécution dans l'exception, car par défaut applets charge dans la sécurité bac à sable, Bac à sable ne vous permet d'établir des connexions URL au domaine au service de l'applet. Autrement dit, vous ne pouvez pas créer une connexion URL à Google, sauf si vous applet est hébergé par google.

Vous devez effectuer les opérations suivantes afin de se connecter correctement à une URL à distance.

Créer un certificat auto-signé au moins, l'idéal que vous avez un certificat vérifié créant un lien par verisign ou une autre autorité de certification (CA) de votre choix. Instructions certificat

Signez votre pot en utilisant jarsigner. signature Instructions

Maintenant, vous pouvez envelopper votre code dans un bloc privilégié comme suit

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

J'ai importé votre code d'applet, que j'ai changé autour, tirant l'instanciation img hors du bloc privilégié et ayant le bloc renvoie une URL. Cela fonctionne quand je charge dans un navigateur Web.

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

  }
}

Autres conseils

Il semble que vous utilisez une applet au lieu d'une application normale. Une applet ne peut pas récupérer des ressources en dehors du domaine, il a été chargé. L'idée est d'empêcher que des applications « mauvaises » d'appeler quelque chose comme

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

ou d'autres types de transférer les données vers une destination inconnue.

Si vous avez vraiment besoin de récupérer des données externes que vous avez à signe votre applet.

  1. dans le même dossier de votre pot Créer un appel de fichier « policy.all »
  2. copier / coller le texte suivant dans le:

      

    grant {java.security.AllPermission permission;};

  3. Lancer l'application comme ceci:

      

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

On dirait que vous n'êtes pas essayer de créer un fichier jar qui sera exécuté à partir de la ligne de commande, mais une applet qui sera exécuté dans le navigateur. Si cela est vrai, vous êtes à peu près pas de chance parce que les applets ne sont autorisés à accéder au serveur sur lequel ils ont été chargés à partir. Si vous voulez vraiment accéder à d'autres serveurs à partir d'une applet, vous devez signer votre applet; Google peut vous aider à trouver plus d'informations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top