2010-04-14 83 views
1

我必須使用用戶名和密碼連接到https URL來讀取文件。我無法連接到服務器(請參閱下面的錯誤日誌)。我沒有太多的Java經驗,所以我需要這些代碼的幫助。錯誤:java.security.AccessControlException:訪問被拒絕

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) 

回答

0

一個applet只可以訪問它從加載的服務器。很可能您的小程序不是從您嘗試連接的服務器加載的?

編輯:你的stacktrace建議,有一個專門的安全管理器安裝(COM.ibm.JEmpower.applet.AppletSecurity)。谷歌搜索這個類揭示了這個問題:http://lekkimworld.com/2006/02/28/imported_java_agent.html

+2

Domino使用此安全管理器通過Java代理強制實施其自己的粒度安全模型。聽起來,正如Sio在下面暗示的那樣,代理沒有以適當的權限運行。例如,訪問遠程資源的Java代碼在Domino世界中需要「受限制」的權限。 – Ben 2010-04-16 12:35:52

1

我認爲這是一個Java代理?事情要檢查。

  1. 在安全級別設置爲您想要執行的代理屬性中。通常文件訪問至少需要級別2.

  2. 代理程序或代理程序被設置爲允許在服務器上運行的用戶的簽名。

  3. 您可以修改java.policy文件以允許訪問某些受限制的類。 (但你需要知道你爲什麼要做這個改變)。

從IBM

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

+0

我已將代理中的安全級別設置爲3,現在我得到以下豁免: 導致:java.security.KeyStoreException:IBMKeyManager:訪問密鑰庫的問題java.security.cert.CertificateParsingException:java.io.IOException:主題密鑰java.security.spec.InvalidKeySpecException:未知的密鑰規範。 at com.ibm.jsse2.ic.a(ic.java:16)at com.ibm.jsse2.kc.g(kc.java:4)at com.ibm.jsse2.kc。在java.lang.Class.newInstance(Class.java:1325)處的java.security.Provider $ Service.newInstance(Provider.java:java.lang.JavaInterals.NewInstanceImpl(Native Method) 880) – RMD 2010-04-16 14:44:41

+0

這看起來像一個新問題。也許關鍵商店配置?不是我玩過的區域。 :/ – Sio 2010-04-19 10:05:27

0

This支持線程,如果你是一個8.5的Domino服務器上運行的聲音類似於你的問題。

2

舊的線程,但我偶然發現它,所以這裏有一個更新的答案。

答案在你的堆棧跟蹤中。雖然它可能與Domino的使用有關,但這是一個普通問題,對於從標準Ja​​va瀏覽器插件調用的普通JVM上使用的非常簡單的小程序而言,顯然您的Java代理正在使用小應用程序沙箱。

不允許Applets(除了直接修改客戶端計算機上的Java安全策略)執行一些關鍵調用。即使使用簽名的小程序。

在你的情況下,System.exit(-1)觸發異常。原因是applet的生命週期相當複雜,你不應該搞亂它。這是爲了您自己的利益,因爲您希望瀏覽器能夠與applet進行交互,並能夠拆除(或重新使用)啓動的用於運行applet的JVM進程。通過調用System.exit()或其他人,你會搞砸這個生命週期,並且你的瀏覽器有機會控制applet的銷燬。

您可能需要重新考慮爲什麼您需要這樣做,因爲您可能不需要在那裏調用System.exit()調用。

相關問題