Ошибка: java.security.AccessControlException: доступ запрещен - PullRequest
1 голос
/ 14 апреля 2010

Мне нужно подключиться к 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)

Ответы [ 4 ]

2 голосов
/ 05 ноября 2012

Старая тема, но я наткнулся на нее, поэтому вот обновленный ответ.

Ответ находится в вашей трассировке стека. хотя это может касаться использования Domino, это общая проблема, которая может возникнуть для довольно простого апплета, используемого на обычной JVM, вызываемой из стандартных плагинов браузера Java, и, очевидно, ваш агент Java использует изолированную программную среду апплета.

Апплетам не разрешается (кроме как путем непосредственного изменения Политики безопасности Java на клиентском компьютере) для выполнения некоторых критических вызовов. Даже при использовании подписанных апплетов.

В вашем случае, System.exit(-1) вызывает исключение. Причина этого в том, что апплеты имеют довольно сложный жизненный цикл, и вы не должны возиться с ним. Это для вашего же блага, так как вы хотите, чтобы браузер мог взаимодействовать с апплетом для вас и иметь возможность разрушать (или повторно использовать) процесс JVM, запущенный для запуска апплета. Вызывая System.exit() или другие, вы можете испортить этот жизненный цикл и шансы вашего браузера контролировать уничтожение апплета.

Возможно, вы захотите еще раз подумать, зачем вам это нужно, поскольку вам, вероятно, не нужно вызывать System.exit() вызов там.

1 голос
/ 16 апреля 2010

Я так понимаю, это агент Java? Вещи, чтобы проверить.

  1. В свойствах агента устанавливается уровень безопасности для того, что вы хотите сделать. Обычно для доступа к файлу требуется уровень не ниже 2.

  2. Подпись агента или пользователя, для которого агент настроен для запуска, поскольку ему разрешено работать на сервере.

  3. Вы можете изменить файл java.policy, чтобы разрешить доступ к некоторым ограниченным классам. (но вам нужно знать, почему вы делаете изменения).

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

0 голосов
/ 19 апреля 2010

Этот поток поддержки от IBM звучит аналогично вашей проблеме, если вы работаете на сервере Domino 8.5.

0 голосов
/ 14 апреля 2010

Апплет может получить доступ только к серверу, с которого он загружен. Скорее всего, ваш апплет не загружен с сервера, к которому вы пытаетесь подключиться?

РЕДАКТИРОВАТЬ: ваша трассировка стека предполагает, что установлен специальный менеджер безопасности (COM.ibm.JEmpower.applet.AppletSecurity). Поиск в этом классе выявляет проблему: http://lekkimworld.com/2006/02/28/imported_java_agent.html

...