繁体   English   中英

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

[英]Error: java.security.AccessControlException: Access denied

我必须使用用户名和密码连接到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)

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

答案在您的堆栈跟踪中。 尽管它可能与Domino的使用有关,但这是一个普遍问题,对于从标准Ja​​va浏览器插件调用的普通JVM上使用的非常简单的applet而言,这显然会发生,并且您的Java Agent显然正在使用applet沙箱。

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

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

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

我认为这是Java代理? 要检查的事情。

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

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

  3. 您可以修改java.policy文件以允许访问某些受限制的类。 (但您需要知道为什么要进行更改)。

http://java.sun.com/j2se/1.5.0/docs/guide/security/permissions.html

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

编辑:您的堆栈跟踪建议,有一个专门的安全管理器已安装(COM.ibm.JEmpower.applet.AppletSecurity)。 仔细研究此类可以发现问题: http : //lekkimworld.com/2006/02/28/imported_java_agent.html

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM