我正在编写一个简单的applet(我的第一个)来从twitter帐户中检索最新状态。从eclipse中启动的javaw.exe运行时,这可以正常工作。但是,从浏览器运行时我收到错误:
java.security.AccessControlException:访问被拒绝(java.net.SocketPermission twitter.com:80连接,解析)
关于如何避免这种情况的任何建议?
电话:
private void updateStatus() {
try {
Twitter client = new Twitter("user", "pw");
Status status = client.getStatus();
addItem(status.toString());
}
catch (Throwable t) {
addItem(t.getMessage());
}
}
与客户端的连接正在成功。它是getStatus()调用,它抛出异常。我注意到eclipse在javaw.exe中添加了“-Djava.security.policy = java.policy.applet”,不确定这是否与eclipse的工作原理有关,而不是在浏览器中。令人沮丧的是,我尝试使用与eclipse成功使用相同的CL参数和PATH直接运行相同的javaw.exe命令。但是,当我直接运行它时,javaw.exe会立即退出。 jtwitter是Twitter API上的一个简单包装器。
答案 0 :(得分:2)
浏览器小程序在具有较低安全权限的沙箱中运行。不允许某些操作,例如某些GUI操作(以防止例如applet在后台秘密运行键记录器)。显然你也不允许进行你正在尝试的操作。
要解决此问题,您必须在applet上签名。允许签名的小程序在正常安全权限下运行。为此,您必须创建安全证书并使用jarsigner在applet上签名。
无需购买昂贵的证书,至少如果这是一个小型个人项目则不需要。一个自签名证书就可以了(唯一的麻烦就是浏览器会弹出一条消息,说“证书无法确认”或类似的东西)。
答案 1 :(得分:0)
@ Dave
除了让您的jar签名之外,您还必须确保标记为特权的代码包含在特权块中。
final String googleUrl = "www.google.com"
URL url = (URL) AccessController.doPrivileged(new PrivilegedAction()
{
public Object run()
{
try
{
return new URL(googleUrl);
}
catch (MalformedURLException e)
{
e.printStackTrace();
return null;
}
}
});