如何通过java applet中的jtwitter(twitter API)避免java.security.AccessControlException

时间:2010-01-27 14:58:04

标签: java security applet twitter

我正在编写一个简单的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上的一个简单包装器。

2 个答案:

答案 0 :(得分:2)

浏览器小程序在具有较低安全权限的沙箱中运行。不允许某些操作,例如某些GUI操作(以防止例如applet在后台秘密运行键记录器)。显然你也不允许进行你正在尝试的操作。

要解决此问题,您必须在applet上签名。允许签名的小程序在正常安全权限下运行。为此,您必须创建安全证书并使用jarsigner在applet上签名。

无需购买昂贵的证书,至少如果这是一个小型个人项目则不需要。一个自签名证书就可以了(唯一的麻烦就是浏览器会弹出一条消息,说“证书无法确认”或类似的东西)。

另请参阅:Signed applet tutorial

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