错误:java.security.AccessControlException:访问被拒绝

错误:java.security.AccessControlException:访问被拒绝,java,security,access-denied,lotus-domino,Java,Security,Access Denied,Lotus Domino,我必须使用用户名和密码连接到https URL才能读取文件。我无法连接到服务器(请参阅下面的错误日志)。我没有太多的Java经验,所以我需要这段代码的帮助 import lotus.domino.*; import java.net.*; import java.io.*; import javax.net.ssl.HttpsURLConnection; public class JavaAgent extends AgentBase { public void NotesMain() {

我必须使用用户名和密码连接到https URL才能读取文件。我无法连接到服务器(请参阅下面的错误日志)。我没有太多的Java经验,所以我需要这段代码的帮助

import lotus.domino.*;
import java.net.*;
import java.io.*;
import javax.net.ssl.HttpsURLConnection;

public class JavaAgent extends AgentBase {

public void NotesMain() {

  try {
    String username = "123";
    String password = "456";
    String input = username + ":" + password;
    String encoding = new sun.misc.BASE64Encoder().encode (input.getBytes());

    //Open the URL and read the text into a Buffer
    String urlName = "https://server.org/Export.mvc/GetMeetings?modifiedSince=4/9/2010";
    URL url = new URL(urlName);
    HttpsURLConnection connection = (HttpsURLConnection)url.openConnection();

    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    connection.setRequestProperty("Content-Length", String.valueOf (encoding.length())); 
    connection.setUseCaches(false);
    connection.setDoInput(true);
    connection.setDoOutput(true);
    connection.setAllowUserInteraction(true);
    connection.setRequestProperty("Authorization", "Basic " + encoding);
    connection.setRequestProperty("Cookie", "LocationCode=Geneva");

    connection.connect();

    BufferedReader rd = null;
      try{
        rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
      } catch (IOException e) {
        System.out.println("Read failed");
        System.exit(-1);
      }

    String line;
    while((line = rd.readLine()) != null) {
      System.out.println(line.toString());
    }
    rd.close();

    connection.disconnect();

  } catch(Exception e) {
    e.printStackTrace();
  }
}
}
引发异常:

java.security.AccessControlException: Access denied (java.lang.RuntimePermission exitVM.-1)
 at java.security.AccessController.checkPermission(AccessController.java:108)
 at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
 at COM.ibm.JEmpower.applet.AppletSecurity.superDotCheckPermission(AppletSecurity.java:1449)
 at COM.ibm.JEmpower.applet.AppletSecurity.checkRuntimePermission(AppletSecurity.java:1311)
 at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1611)
 at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1464)
 at java.lang.SecurityManager.checkExit(SecurityManager.java:744)
 at java.lang.Runtime.exit(Runtime.java:99)
 at java.lang.System.exit(System.java:275)
 at JavaAgent.NotesMain(Unknown Source)
 at lotus.domino.AgentBase.runNotes(Unknown Source)
 at lotus.domino.NotesThread.run(Unknown Source)

小程序只能访问从中加载的服务器。很可能您的小程序没有从您尝试连接的服务器加载


编辑:您的stacktrace建议安装了专门的安全管理器(COM.ibm.JEmpower.applet.AppletSecurity)。通过谷歌搜索这个类可以发现问题:

我想这是一个Java代理?要检查的东西

  • 在代理属性中,为要执行的操作设置安全级别。通常,文件访问至少需要级别2

  • 允许在服务器上运行的代理或代理设置为运行的用户的签名

  • 您可以修改java.policy文件以允许访问某些受限类。(但你需要知道你为什么要做出改变)

  • 如果您在8.5 Domino服务器上运行,IBM的支持线程听起来与您的问题类似。

    旧线程,但我偶然发现了它,所以这里有一个更新的答案

    答案就在你的记忆里。虽然它可能与Domino的使用有关,但对于从标准Java浏览器插件调用的普通JVM上使用的非常简单的小程序来说,这是一个普遍的问题,显然您的Java代理正在使用小程序沙箱

    不允许小程序(除非直接修改客户端计算机上的Java安全策略)执行某些关键调用。即使使用签名小程序

    在您的情况下,
    System.exit(-1)
    正在触发异常。这是因为小程序有一个相当复杂的生命周期,你不应该乱弄它。这是为了您自己的利益,因为您希望浏览器能够为您与小程序交互,并且能够中断(或重新使用)运行小程序所启动的JVM进程。通过调用
    System.exit()
    或其他方法,您将搞乱此生命周期以及浏览器控制小程序销毁的机会


    您可能需要重新考虑一下为什么需要这样做,因为您可能不需要在那里调用
    System.exit()
    调用。

    Domino使用此安全管理器对Java代理实施自己的细粒度安全模型。正如Sio在下面暗示的那样,听起来代理没有以适当的权限运行。例如,在Domino世界中,访问远程资源的Java代码需要“受限”权限。我已将代理中的安全级别设置为3,现在我得到了这个例外:由以下原因引起:Java.security.KeyStoreException:IBMKeyManager:访问密钥存储问题Java.security.cert.CertificateParsingeException:Java.io.IOException:subject key,java.security.spec.InvalidKeySpecException:com.ibm.jsse2.ic.a(ic.java:16)com.ibm.jsse2.kc.g(kc.java:4)com.ibm.jsse2.kc.(kc.java:19)java.lang.J9VMInternals.newInstanceImpl(本机方法)java.lang.Class.newInstance(Class.java:1325)java.Provider$Service.newInstance(Provider.java:880)这看起来是一个新问题。可能是密钥存储配置?不是我玩过的地方/