我想创建一个java jar applet,它将在浏览器中运行,从URL下载图像并将其显示给用户。 我的实现是:在jar中加载web图像时的安全异常
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)
解决方案:
我已经实现了刀 - 动作 - 耶稣的建议,并且它在网页浏览器中工作(但不使用小程序查看器)。
只有与applet查看我还是会遇到:
java.security.AccessControlException: access denied (java.net.SocketPermission www.google.com:80 connect,resolve)
当加载网页在浏览器中,有一个信托/拒绝对话框,如果我单击信任,然后将图像显示出来。
这些是我采取的步骤:
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源代码(强调的概念,我删除了所有额外的异常处理/ null检查):
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;
}
});
}
}
什么是上下文?它是一个小程序吗? – 2010-01-06 14:38:28
(我建议不要规避安全策略,除非你真的知道你在做什么。) – 2010-01-06 14:39:12
是的,我应该指定我试图在网站上制作一个小程序。 目前的解决方法是在jar中最糟糕的情况下包含所有可能使用的图像,这会导致瓶子膨胀。 – dsg 2010-01-06 20:57:49