【发布时间】:2012-02-23 17:08:25
【问题描述】:
我做了一个小程序。这个小程序在appletviewer 中完美运行。但是,当我将这个小程序的类文件连同我自己签名的 Jar 文件一起放在一个目录中,并创建一个带有小程序标签的 .HTML 文件时,它就不起作用了。我不断收到java.security.AccessControlException: access denied。
我怎样才能使这项工作?这是源代码,下面是问题,下面是小程序的嵌入方式。:
import javax.swing.*;
import java.applet.Applet;
import java.applet.AppletContext;
import java.applet.AppletStub;
import java.awt.*;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashMap;
public class RSLoad extends JApplet implements AppletStub {
/**
*
*/
private static final long serialVersionUID = 1L;
private static final HashMap<String, String> PARAMETERS = new HashMap<String, String>();
private static final String LINK = "http://world2.runescape.com/";
public void init() {
try {
setVisible(true);
setSize(775, 540);
parse(LINK);
dwnld(LINK + PARAMETERS.get("archive"));
ClassLoader loader = new URLClassLoader(new URL[]{new File("Runescape.jar").toURI().toURL()});
Class<?> client = loader.loadClass("Rs2Applet");
Applet applet = (Applet) client.newInstance();
applet.setStub(this);
applet.init();
applet.start();
add(applet, BorderLayout.CENTER);
} catch (Exception e) {
e.printStackTrace();
}
}
public void appletResize(int width, int height) {
}
public final String getParameter(String name) {
return PARAMETERS.get(name);
}
public final URL getDocumentBase() {
try {
return new URL(LINK);
} catch (MalformedURLException e) {
return null;
}
}
public final URL getCodeBase() {
try {
return new URL(LINK);
} catch (MalformedURLException e) {
return null;
}
}
public final AppletContext getAppletContext() {
return null;
}
private void parse(final String url) {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(new URL(url).openStream()));
String line;
while ((line = in.readLine()) != null) {
if (line.contains("app") && line.contains("write")) {
PARAMETERS.put("<app", "");
PARAMETERS.put("let ", "");
} else if (line.contains("scriptsrc") || line.contains("ie6")) {
} else if (line.contains("document.write")) {
line = line.replaceAll("document.write", "").replaceAll("<param name=\"", "").replaceAll("\">'", "\"").replaceAll("'", "").replaceAll("\\(", "").replaceAll("\\)", "").replaceAll("\"", "").replaceAll(" ", "").replaceAll(";", "").replaceAll("value", "");
String[] splitted = line.split("=");
if (splitted.length == 1) {
PARAMETERS.put(splitted[0], "");
} else if (splitted.length == 2) {
PARAMETERS.put(splitted[0], splitted[1]);
} else if (splitted.length == 3) {
PARAMETERS.put(splitted[0], splitted[1] + splitted[2]);
}
}
}
in.close();
} catch (Exception e) {
System.out.println("Error Parsing!");
}
}
private void dwnld(final String url) {
try {
BufferedInputStream in = new BufferedInputStream(new URL(url).openStream());
FileOutputStream fos = new FileOutputStream("Runescape.jar");
BufferedOutputStream out = new BufferedOutputStream(fos, 1024);
byte[] data = new byte[1024];
int x;
while ((x = in.read(data, 0, 1024)) >= 0) {
out.write(data, 0, x);
}
in.close();
out.close();
} catch (Exception e) {
System.out.println("Error Downloading!");
e.printStackTrace();
}
}
}`
'java.security.AccessControlException: access denied (java.net.SocketPermission world2.runescape.com:80 connect,resolve)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
at sun.plugin2.applet.Applet2SecurityManager.checkConnect(Applet2SecurityManager.java:505)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:528)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:234)
at sun.net.www.http.HttpClient.New(HttpClient.java:307)
at sun.net.www.http.HttpClient.New(HttpClient.java:324)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:970)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:836)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1172)
at java.net.URL.openStream(URL.java:1010)
at RSLoad.dwnld(RSLoad.java:95)
at RSLoad.init(RSLoad.java:26)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1639)
at java.lang.Thread.run(Thread.java:680)
java.security.AccessControlException: access denied (java.util.PropertyPermission user.dir read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)
at java.lang.System.getProperty(System.java:667)
at java.io.UnixFileSystem.resolve(UnixFileSystem.java:118)
at java.io.File.getAbsolutePath(File.java:501)
at java.io.File.getAbsoluteFile(File.java:517)
at java.io.File.toURI(File.java:660)
at RSLoad.init(RSLoad.java:27)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Plugin2Manager.java:1639)
at java.lang.Thread.run(Thread.java:680)
像这样嵌入:
<html>
<body>
<applet code=RSLoad.class archive="RSLoad.jar" width=100% height=100%>
</applet>
</body>
</html>
【问题讨论】:
-
系统会提示您接受数字签名代码吗?顺便说一句 - 为什么要编写小程序而不是框架?
-
系统提示我接受代码,我正在为一个特殊项目做一个小程序。
-
“我被提示签署代码” 我询问您是否被提示接受签署的代码。 “我正在为一个特殊项目做一个小程序。” 这并没有回答我的问题。为什么是小程序而不是框架?这个特殊项目需要一个小程序(具体来说)是什么?
-
这是一个特殊项目,但另一个原因是其他人可以随意访问它,因为新的 Runescape Applet 滞后很多,而且我在 Applet/JFrame 中获得了更好的 FPS。但它不在框架中的原因是因为没有多少人想要下载某些东西,我认为他们最好还是去一个网站。
-
顺便说一句-刚刚注意到
implements AppletStub。你想达到什么目的?我已经编写了数百个小程序并处理了数千个,但我必须实现AppletStub的次数达到(计数..) 1。那是针对Appleteer,这是一个桌面应用程序。用于加载和测试小程序。 你有什么用例来实现AppletStub? (具体一点,这个“特殊项目”并没有浪费我的时间。)